catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

OpenCVのNDK-Build

Android上でOpenCVを使って少し複雑な画像認識をするために、NDKビルドというものをする必要がある。
そのための準備。

序章:NDK-Buildとは?それを使って何ができる?

まず、一般的なAndroidのアプリケーションはJavaで記述する。
JavaはVM上で動作するため、ネイティブ動作するアプリケーションと比べて遅い。
(速い/遅いといった速度の話は10年以上前からいろいろ議論されてるので、詳細は割愛)
ソフトウェア性能の面から、速度が問題になるケースは次のようなケース。

・リアルタイム処理での性能限界
・単一のトランザクション処理の性能劣化

前者はゲームソフトなどでの処理落ちなどが分かりやすい例。
後者は今回は関係ないが、I/O処理(サーバとの通信・ディスクへのデータ保存)に時間がかかる場合などが考えられる。
性能指標でいうと、前者はスループット、後者はターンアラウンドタイムといったところか。

さて、ndk-buildを行うと、Java-VM上でAPI呼び出してごにょごにょ~とアルゴリズムを組み立てるのに比べて、速度の向上が望める。
特に画像認識の部分。

というわけで、今回はndkでネイティブOpenCVのビルド環境の構築。

1, Cygwinをインストールする

なくてもいいけれども、Webを調べてみると説明を記述してくれている多くのサイトではCygwinを使っている。
Windowsのコマンドラインより、慣れてるLinuxコマンドのほうが扱いやすいってのもあるので、インストール。

まずウチのOSは64bit版windowsなのでダウンロードとインストール。
インストールウィザード画面で追加コンポーネントのインストールでいろいろ選択する必要あり。
当面必要になりそうなもの:
gcc
・make
たぶんこんくらい。


メモ:
cygwinインストール後、ターミナル上から任意のフルパス指定で移動したいとき
/cygdrive/”windowsフルパス”でいける。
cygwinからプロジェクトのパスまで移動してndk-buildと打つ。

 

2, Android-NDKのインストールを行う。

以下のURLからAndroid-NDKのダウンロードをする。
http://developer.android.com/tools/sdk/ndk/index.html
zipで落ちてくるので、Android-SDKと同じパスに置いておく。
(展開に時間かかるかもしれない。)
展開が終わったら、そのディレクトリパスをWindowsの環境変数PATHに設定する。
これでコマンドラインからndk-buildを行えるはず。


ためしに、Android-NDKのサンプルプロジェクトをビルドしてみる。

Catalina@Catalina-PC /cygdrive/c/Users/Catalina/android-ndk-r9/samples/hello-jni
$ ndk-build
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Cygwin         : Generating dependency file converter script
Compile thumb  : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so


正常にできたっぽい。共有ライブラリの形で出力するんですね。初めて知った。
うまくいかないときはPathの設定を確認。Windowsの環境変数から設定した後に端末再起動して"path"コマンド打って出てきた内容を確認する。
他にも色々と環境変数の設定をする。マニュアルに従って一個一個。

 

3, サンプルのビルドとOpenCV顔認識アプリのビルド

というわけでOpenCVの顔認識アプリも同じようにビルド。
初めてOpenCV触ったとき動かなかった顔認識アプリだが、これはネイティブビルドをしていなかったために、共有ライブラリを呼び出せずに落ちていた。

http://catalina1344.hatenablog.jp/entry/2013/05/03/165448

コマンドラインからndk-buildを行い、Eclipse上からJavaコードを含めてビルド。
実機で実行したらうまく動いた。

というわけで基本的なNDK-Buildはできるようになった。
次は自分で記述したネイティブコードをビルドする段階かなー。
だいたいこのへんでハマるんですよ。ここからはmakefile記述も必要そうだし。