无法在OpenCV Android示例中链接本机库

时间:2012-06-01 21:03:07

标签: android opencv android-ndk

我有OpenCV代码(c ++),我想在Android中使用它。要做到这一点,我必须使用Android NDK。我下载了OpenCV package for Android development(版本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. Native OpenCV Samples for Android throws UnsatisfiedLinkError
  2. java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null
  3. Major OpenCV-Android for Windows Installing and Running Issues(无回答)
  4. 此外,我已在不同设备和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
    

3 个答案:

答案 0 :(得分:16)

Whoohoo!

最后,我自己找到了解决这个问题的方法!

我决定调试行:

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忽略了它。所以我决定手动复制并加载它。为此,我从libopencv_java.so复制了/opt/OpenCV-2.4.0/libs/armeabi-v7a并编辑了java代码:

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

实际上类似的问题是:

  1. Can not load Opencv libraries in necessitas
  2. Android OpenCV: cannot dlopen camera wrapper library
  3. 从第二个解决方案我发现我可以使用dlopen加载库,但我还没有尝试过。

    所以我会编写一个简单的bash-script来为自己编写(只是复制)。

    感谢所有人。

答案 1 :(得分: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;
                }
            }

答案 2 :(得分:0)

你处于比实际问题更高的水平。运行时请参阅"Getting started with the NDK"

    cd <project>
    <ndk>/ndk-build

......它说什么? (请记住使用cygwin窗口而不是dos提示符。)