Windows環境のAndroid StudioでOpenCV for androidのサンプルを動かすためにやったこと

基本的には
http://workpiles.com/2015/04/android-opencv-face_detection/
の通りですが，一部変更が必要な箇所があったので，備忘録として．

使用したOpenCVのバージョンは2.4.11

含まれているサンプルの中のface-detectionを動かすことを目標にします．

android SDK, NDK, OpenCV for android SDKはダウンロードして適当な場所に解凍しておく．

#プロジェクトのインポート
File > New > Import Project で，`OpenCV-android-sdk/samples/face-detection`を指定してインポート．
表示されるダイアログは特にいじらず，Next からの Finish

API14が入っていないと，その旨のメッセージが表示されるかもしれないので，その時はそのダイアログに従って必要なものをインストールする．

### aidl is missing

```
Error:Execution failed for task ':openCVLibrary2411:compileDebugAidl'.
> aidl is missing
```
なるエラーが．
ビルドツールのバージョンが23.0.0 rc1に指定されているのに`<android-sdk-path>\build-tools\23.0.0_rc1`以下にaidl.exeが無いのが原因．（ちなみに，`<android-sdk-path>`は`local.properties`内に`sdk.dir`として設定されている）

File > Project Structure を開き，
openCVSamplefacedetection, openCVLibrary2411共に，Build Tools Versionを22.0.1に設定する．

参考：http://stackoverflow.com/questions/30506406/aidl-is-missing-android-studio

## エンコーディング
ファイルのエンコードがWindows31で良いのかとか言われたりするので，
File > Settings を開き，
Editor > File Encodings で IDE Encoding, Project Encoding 共に UTF-8に設定．

#NDKの設定

この段階で一旦ビルドしてみると，

```
Error:Execution failed for task ':openCVSamplefacedetection:compileDebugNdk'.
> NDK not configured.
Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.
(On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
```

とか言われる．
上記リンク先にもあるように，
`local.properties`に

```
ndk.dir=C\:\\Users\\hoge\\android-ndk-r10e
```
を追加．（環境によって変わる．NDKを置いた場所を指定する．）
Windows環境なので区切り文字がバックスラッシュ＆エスケープが必要なのに注意．

#build.gradle設定
openCVSamplefacedetectionモジュールのbuild.gradleもいじる．

```groovy:build.gradle
android {
    ...

    sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir 'src\\main\\libs'
    }

    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        def ndkDir = "C:\\Users\\hoge\\android-ndk-r10e"
        commandLine "$ndkDir\\ndk-build.cmd",
                '-C', file('src\\main\\jni').absolutePath,
                '-j', Runtime.runtime.availableProcessors(),
                'all',
                'NDK_DEBUG=1'
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }
}
```

これまたリンク先と違い，ディレクトリ区切りがバックスラッシュなのに注意．
`ndk-build`コマンドも，`ndk-build.cmd`に変えてある．
`sourceSets.main`以下の記述もちょっと変えてある．( http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio )

## 複数の環境に対応させるには
同じbuild.gradleでwindows環境にもlinux環境にも対応させたい．
http://qiita.com/abekatsu/items/31459d11284623277668#buildgradle
こうすればよいのか．

#Android.mk
`face-detection\openCVSamplefacedetection\src\main\jni\Android.mk`を書き換え．

```
include ../../sdk/native/jni/OpenCV.mk
```
を絶対パスに変える．
例えば

```
include C:\Users\hoge\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
```
とか．

#Application.mk
以上の状態でビルドすると，ビルドは通る（Build > Make Project）．

しかし，実行してみる（Run > Run 'openCVSamplefacedetection`して，エミュレータや実機に転送）と，
端末には"Unfortunately, OCV Face Detection has stopped"と表示されてアプリが停止し，
logcatには

```
05-31 19:07:07.437  29773-29773/org.opencv.samples.facedetect E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.UnsatisfiedLinkError: Couldn't load detection_based_tracker: findLibrary returned null
```
的なエラーが．

正しいターゲットを指定できておらず，ライブラリを読み込めていない（？）っぽい．

`face-detection\openCVSamplefacedetection\src\main\jni\Application.mk`を修正する．

```
APP_ABI := armeabi armeabi-v7a mips x86
```

( 参考：http://answers.opencv.org/question/4222/problem-working-with-native-apps/ )

これでもう一度ビルド→実行．
動いた！