【问题标题】:Unable to link native library in OpenCV Android sample无法在 OpenCV Android 示例中链接本机库
【发布时间】:2012-06-07 02:37:23
【问题描述】:

我有想要在 Android 中使用的 OpenCV 代码 (c++)。为此,我必须使用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(无人接听)

我还在不同的设备和 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 的 bug。


更新:构建日志:

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

【问题讨论】:

标签: android opencv android-ndk


【解决方案1】:

哇哦!

终于我自己找到了解决这个问题的方法!

我决定调试线路:

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

从第二个解决方案我发现我可以使用dlopen 加载库,但我还没有尝试过。

所以我将编写简单的 bash 脚本,为自己完成(只是复制)。

谢谢大家。

【讨论】:

  • 即使包含两行,我在某些设备上也遇到了这个问题。
  • 您能告诉我您将 /opt/OpenCV-2.4.0/libs/armeabi-v7a/libopencv_java.so 复制到哪里吗?我目前面临同样的问题
【解决方案2】:

而不是将您的本机库加载为

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

在“BaseLoaderCallBack”中的“onManagerConnected”方法连接 opencv 管理器后加载您的库。以下是我的代码 sn-p 为我工作

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;
                }
            }

【讨论】:

  • 非常感谢!这就是我的解决方案!
【解决方案3】:

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

    cd <project>
    <ndk>/ndk-build

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

【讨论】:

  • “它说什么”是什么意思?如果构建日志然后查看我的问题的 更新(我从 linux 构建)。
  • 嗯.. 听起来很愚蠢,但是您在 ndk-build 之后清理了项目吗?另外,检查“钩子”或任何它的名称,它看起来像... void Java_com_hw_ndk_HWNDKActivity_helloLog(JNIEnv * env, jobject this, jstring logThis) ...它必须对应于 com.hw.ndk (包名)。我自己是新手。
  • 当然我不会在构建后清理项目。即使在设备上运行程序后,库仍然在 lib 文件夹中。也许您的意思是 javah 实用程序?如果是这样,那么是的,我检查了函数名称。
  • 我的理解是 Eclipse 并没有真正集成到(本机代码的)构建过程中。当您运行 ndk-build 时,它会编译本机库,但 Eclipse 并不真正了解它。所以你必须在每次 NDK 构建后进行 Project-->Clean 。然后在 Eclipse 中运行。
  • 我的操作:1. ndk-build clean 2. ndk-build 3. 项目->清理(未设置自动构建) 4. 调试为 android 应用程序。结果是一样的。
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多