自作アプリにOpenCVを組み込んだら動かない・・・。

前回まででOpenCVのサンプルプログラムを使って順調にネコを認識することに成功したんで、いよいよ完全な自作アンドロイドアプリを製作開始。「OpenCVのサンプルを元に作ろう、いやーこりゃあ意外とさくっとできちゃうなぁ」とか高をくくってたらこれが全く動かないでガチハマりしたので、同じようにハマる人がいるに違いないと思ってここにメモしておきます。
僕が利用したのはOpenCV-android-sdkのsamplesのface-detectionなんですけど、ビルドは通るものの強制終了されてしまう。
エラーログを見ると「Native method not found」ほにゃらら。
さらにそのエラーが出る直前のログを見てみると「No implementation found for native DetectionBasedTracker」ほにゃらら。
訳が分からない、サンプルプログラムでは動いてるじゃないか。どうして自分のプログラムにOpenCVをリンクしようとすると強制終了になるのか。
で、調べてようやくわかりました。下のサイトに書いてありました。英語なんで訳すの面倒ですから簡単に説明します。
getting unsatisfiedLinkerror while trying to re-use opencv-facedection sample
OpenCVを自作アプリに組み込むには?
簡単に言うと、C++のヘッダーファイルとCPPファイルの関数名を書き換えないといけないらしいです。
例えば、face-detectionの場合には、jniにあるDetectionBasedTracker_jni.cppとDetectionBasedTracker_jni.hがそれにあたるんですが、その中にある
JNIEXPORT jlong JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeCreateObject
を
JNIEXPORT jlong JNICALL Java_自分のパッケージ名_DetectionBasedTracker_nativeCreateObject
とすればOKです。
アプリのパッケージ名がnet.findelight.www.catsnapの場合は、JNIEXPORT jlong JNICALL Java_net_findelight_www_catsnap_DetectionBasedTracker_nativeCreateObjectとなります。
これが誰かの助けとなりますように。
それでは恒例の癒されるネコさんの画像でお別れしましょう。
このアプリに関する記事一覧はこちらから。

コメント