ネコが撮影できるスマホアプリを作ろうと思う その4 自作アプリでOpenCVが動かない

スポンサーリンク

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

ネコが撮影できるスマホアプリを作ろうと思う その3 OpenCVでネコを自動で認識
動画からネコを抽出するためには 前回まででネコを撮影するスマホのアプリの基本コンセプト設計と、その中の画像処理部分を担うOpenCVをAn...
前回までで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となります。

これが誰かの助けとなりますように。

それでは恒例の癒されるネコさんの画像でお別れしましょう。
Screenshot

このアプリに関する記事一覧はこちらから。

ネコが撮影できるスマホアプリを作ろうと思う 記事一覧
猫を自動で認識して撮影するアプリ 完成したアプリはこちらです、アンドロイドのみの対応となりますが、カメラをネコに向けると自動でネコの顔を認...
スポンサーリンク