【问题标题】:Native OpenCV Samples for Android throws UnsatisfiedLinkError适用于 Android 的本机 OpenCV 示例引发 UnsatisfiedLinkError
【发布时间】:2011-11-30 12:17:23
【问题描述】:

我尝试在模拟器上运行 opencv android 示例。带有本机代码的示例,例如示例“Tutorial 2 Advanced - 1. Add Native OpenCV”失败。我有一个 Win7 x86 系统。我可以构建本机库,但如果我运行示例,我总是会得到以下异常:

 
10-04 08:08:19.179: WARN/dalvikvm(696): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View;
10-04 08:08:19.190: DEBUG/AndroidRuntime(696): Shutting down VM
10-04 08:08:19.190: WARN/dalvikvm(696): threadid=1: thread exiting with uncaught exception (group=0x40015560)
10-04 08:08:19.289: ERROR/AndroidRuntime(696): FATAL EXCEPTION: main
10-04 08:08:19.289: ERROR/AndroidRuntime(696): java.lang.ExceptionInInitializerError
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at org.opencv.samples.tutorial3.Sample3Native.onCreate(Sample3Native.java:23)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.os.Looper.loop(Looper.java:123)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.reflect.Method.invokeNative(Native Method)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.reflect.Method.invoke(Method.java:507)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at dalvik.system.NativeStart.main(Native Method)
10-04 08:08:19.289: ERROR/AndroidRuntime(696): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load native_sample: findLibrary returned null
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.Runtime.loadLibrary(Runtime.java:429)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.System.loadLibrary(System.java:554)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at org.opencv.samples.tutorial3.Sample3View.(Sample3View.java:27)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     ... 14 more
10-04 08:08:19.389: WARN/ActivityManager(70):   Force finishing activity org.opencv.samples.tutorial3/.Sample3Native
10-04 08:08:19.959: WARN/ActivityManager(70): Activity pause timeout for HistoryRecord{406f26a0 org.opencv.samples.tutorial3/.Sample3Native}
10-04 08:08:20.089: DEBUG/dalvikvm(70): GC_EXPLICIT freed 92K, 47% free 4404K/8263K, external 5449K/5830K, paused 103ms

任何想法,如何解决这个问题? 谢谢

【问题讨论】:

  • 检查您的构建系统上的 apk 以获取正确子目录中的 native_sample.so。如果它在那里,请检查日志中的堆栈跟踪。 JNI_OnLoad 可能会失败,这会导致与没有共享对象相同的错误。
  • @lhw .apk 包含子文件夹 /lib/armeabi-v7a 中的 lib libnative_sample.so。没有其他例外。 PathClassloader 使用 libPath= /data/data/org.opencv.samples.tutorial3/lib 和 as path=/data/app/org.opencv.samples.tutorial3-1.apk 但.apk 被称为“教程2高级 - 1.添加原生OpenCV.apk"

标签: android opencv native sample


【解决方案1】:

Andrey Kamaev 的回答非常好!

以下是我刚刚从我的经验中学到的:

如果您知道您的硬件详细信息(对于您的情况,它是 x86).. 您可以定义如下:

APP_ABI := x86

我们也可以在 jni/Application.mk 中定义如下:

APP_ABI := armeabi armeabi-v7a x86

现在,当我们构建应用程序时,将创建 3 个共享对象库文件。然后当我们运行应用程序时,会根据目标设备加载相应的库。

当我在平板电脑中运行示例 OpenCV Android 本机应用程序时(因为它的硬件支持 armeabi-v7a),它运行良好,但同一应用程序无法在我的三星 Galaxy ACE 手机上运行(不支持 armeabi-v7a)。

所以,我设置了 APP_ABI := armeabi armeabi-v7a,现在该应用程序在平板电脑和手机中都能很好地运行 :)

【讨论】:

    【解决方案2】:

    换行

    APP_ABI := armeabi-v7a
    

    jni/Application.mk

    APP_ABI := armeabi
    

    默认情况下,OpenCV 示例是为现代 armv7-a 硬件配置的。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2012-12-08
      • 1970-01-01
      相关资源
      最近更新 更多