12

Android で使用したい OpenCV コード (c++) があります。これを行うには、Android NDKを使用する必要があります。Android 開発用の OpenCV パッケージ(ver. 2.4.0)をダウンロードし、そのマニュアルのすべての手順を実行しました。基本的なサンプル (Java API のみ) は問題なく実行されます。サンプル #3 (チュートリアル 3 (上級) - ネイティブ OpenCV の追加)は ndk-builder から正しくビルドされます。しかし、Eclipseからデバイスで実行/デバッグしようとすると、常に例外が発生します:

Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View;

この行で:

System.loadLibrary("native_sample");

完全なlogcatログは次のとおりです。

05-31 23:41:45.976: W/ActivityThread(9708): Application org.opencv.samples.tutorial3 is waiting for the debugger on port 8100...
05-31 23:41:45.983: I/System.out(9708): Sending WAIT chunk
05-31 23:41:45.983: I/dalvikvm(9708): Debugger is active
05-31 23:41:46.179: I/System.out(9708): Debugger has connected
05-31 23:41:46.179: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.382: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.585: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.788: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.983: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.186: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.389: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.585: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.788: I/System.out(9708): debugger has settled (1463)
05-31 23:41:47.819: D/szipinf(9708): Initializing inflate state
05-31 23:41:47.866: I/Sample::Activity(9708): Instantiated new class org.opencv.samples.tutorial3.Sample3Native
05-31 23:41:48.909: D/dalvikvm(9708): threadid=1: still suspended after undo (sc=1 dc=1)
05-31 23:41:51.770: I/Sample::Activity(9708): onCreate
05-31 23:41:59.283: W/dalvikvm(9708): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View;
05-31 23:42:01.965: D/AndroidRuntime(9708): Shutting down VM
05-31 23:42:01.965: W/dalvikvm(9708): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-31 23:42:01.999: E/AndroidRuntime(9708): FATAL EXCEPTION: main
05-31 23:42:01.999: E/AndroidRuntime(9708): java.lang.ExceptionInInitializerError
05-31 23:42:01.999: E/AndroidRuntime(9708):     at org.opencv.samples.tutorial3.Sample3Native.onCreate(Sample3Native.java:21)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.os.Looper.loop(Looper.java:130)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.main(ActivityThread.java:3835)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.reflect.Method.invokeNative(Native Method)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.reflect.Method.invoke(Method.java:507)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at dalvik.system.NativeStart.main(Native Method)
05-31 23:42:01.999: E/AndroidRuntime(9708): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load native_sample: findLibrary returned null
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.Runtime.loadLibrary(Runtime.java:429)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.System.loadLibrary(System.java:554)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at org.opencv.samples.tutorial3.Sample3View.<clinit>(Sample3View.java:48)
05-31 23:42:01.999: E/AndroidRuntime(9708):     ... 14 more

同じ問題の解決策を見つけましたが、どれも役に立たなかった:

  1. Android 用のネイティブ OpenCV サンプルが UnsatisfiedLinkError をスローする
  2. java.lang.UnsatisfiedLinkError: opencv_java を読み込めませんでした: findLibrary が null を返しました
  3. OpenCV-Android for Windows のインストールと実行に関する主な問題(回答なし)

また、さまざまなデバイスと Android API バージョンでテストしました。

私のシステム構成:

astor@astor-K42Jv:~$ uname -a
Linux astor-K42Jv 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux

私はこの問題を 4 晩にわたって解決しようとしました (これは私の自由時間です :)) が、うまくいきませんでした。論文にはこれが本当に必要なので、どんな助けでも大歓迎です。


更新:このサンプルを Windows 7 (64) でテストしましたが、結果は同じです。

これは OpenCV のバグのようです。


更新:ビルド ログ:

astor@astor-K42Jv:/opt/eclipse-android/workspace/OpenCV-2.4.0-samples/tutorial-3-native$ ndk-build 
Install        : libnative_camera_r2.2.0.so => libs/armeabi-v7a/libnative_camera_r2.2.0.so
Install        : libnative_camera_r2.3.3.so => libs/armeabi-v7a/libnative_camera_r2.3.3.so
Install        : libnative_camera_r3.0.1.so => libs/armeabi-v7a/libnative_camera_r3.0.1.so
Install        : libnative_camera_r4.0.0.so => libs/armeabi-v7a/libnative_camera_r4.0.0.so
Install        : libnative_camera_r4.0.3.so => libs/armeabi-v7a/libnative_camera_r4.0.3.so
Install        : libnative_sample.so => libs/armeabi-v7a/libnative_sample.so
4

3 に答える 3

17

うわー!

最後に、この問題の解決策を自分で見つけました!

行をデバッグすることにしました:

System.loadLibrary("native_sample");

これを行うには、Android-SDK から Android ソース コードをダウンロードし、ソース フォルダー(/opt/android-sdk-linux/sources/android-15)をプロジェクトに添付しました。この後、エラーが次のとおりであることがわかりました。

Cannot load library: link_image[1936]:    37 could not load needed library 'libopencv_java.so' for 'libhello-jni.so' (load_library[1091]: Library 'libopencv_java.so' not found)

実際、このライブラリはlibディレクトリにありません。理由はわかりませんがndk-build無視しました。そこで、手動でコピーしてロードすることにしました。このために、Javaコードからコピーlibopencv_java.soして編集しました:/opt/OpenCV-2.4.0/libs/armeabi-v7a

static {
    System.loadLibrary("opencv_java"); //load opencv_java lib
    System.loadLibrary("native_sample");
}

実際に同様の問題は次のとおりです。

  1. 必要に応じて Opencv ライブラリをロードできません
  2. Android OpenCV: カメラ ラッパー ライブラリを dlopen できません

2番目の解決策から、 dlopenを使用してライブラリをロードできることがわかりましたが、まだ試していません。

そのため、自分でそれを実行する (コピーするだけの) 簡単な bash スクリプトを作成します。

ありがとうございます。

于 2012-06-03T09:44:47.933 に答える
2

ネイティブライブラリを次のようにロードする代わりに

static{
    System.loadLibrary("YOUR_LIBRARY");
}

「BaseLoaderCallBack」の「onManagerConnected」メソッドでopencvマネージャーが接続された後、ライブラリをロードします。以下は、私のために働く私のコードスニペットです

public void onManagerConnected(int status) {
                switch(status){
                case LoaderCallbackInterface.SUCCESS:
                    Toast.makeText(getApplicationContext(), "manager connected", Toast.LENGTH_LONG).show();
                    System.loadLibrary("MYNATIVELIB");
                    break;
                default:
                    super.onManagerConnected(status);
                    break;
                }
            }
于 2015-04-15T02:52:01.630 に答える
0

あなたは実際の問題よりも高いレベルにいます。実行するときは、「NDKの使用を開始する」を参照してください

    cd <project>
    <ndk>/ndk-build

...それは何と言っていますか?(dosプロンプトではなく、cygwinウィンドウを使用することを忘れないでください)。

于 2012-06-02T17:15:43.457 に答える