【问题标题】:Android 4.2 ndk: library loading crash: load_library(linker.cpp:750) || soinfo_link_image || libhoudini.so || opencvAndroid 4.2 ndk:库加载崩溃:load_library(linker.cpp:750) || soinfo_link_image || libhoudini.so || opencv
【发布时间】:2015-03-02 09:29:47
【问题描述】:

我正在使用包含 opencv 的本机库。 该库在所有设备和模拟器中构建良好并且运行良好,但不适用于 Android 4.2 设备。它在System.loadLibrary("mylib"); 上崩溃。

该库是为 armeabi-v7a armeabi x86 mips 构建的(我在 jnilibs 文件夹中看到生成了所有 so 文件)

我被这个错误困住了,因为我在互联网上找不到任何可以解释我的问题的答案。

Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libopencv_java.so",日志跟踪:

1755-1755/com.ex.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
   java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libopencv_java.so" needed by "libmylib.so"; caused by load_library(linker.cpp:745): library "libopencv_java.so" not found
           at java.lang.Runtime.loadLibrary(Runtime.java:371)
           at java.lang.System.loadLibrary(System.java:535)
           at com.ex.app.core.MyApplication.initVippAsync(MyApplication.java:198)
           at com.ex.app.core.MyApplication.onCreate(MyApplication.java:100)
           at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1000)
           at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4391)
           at android.app.ActivityThread.access$1300(ActivityThread.java:141)
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294)
           at android.os.Handler.dispatchMessage(Handler.java:99)
           at android.os.Looper.loop(Looper.java:137)
           at android.app.ActivityThread.main(ActivityThread.java:5039)
           at java.lang.reflect.Method.invokeNative(Native Method)
           at java.lang.reflect.Method.invoke(Method.java:511)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
           at dalvik.system.NativeStart.main(Native Method)

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
include /Users/ahmed/Documents/openCv4android/OpenCV-2.4.10-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE    := mylib
LOCAL_LDLIBS += -llog -ldl
LOCAL_SRC_FILES := myFile.c
include $(BUILD_SHARED_LIBRARY)

Application.mk:

APP_ABI := armeabi-v7a armeabi x86 mips
APP_PLATFORM := android-16

【问题讨论】:

  • 您在哪种设备上尝试过?您是否检查了设备中是否存在错误消息中所述的丢失文件? libhoudini 的一些阅读:commonsware.com/blog/2013/11/21/… 和 stackoverflow.com/questions/18945181/…
  • 100% 可在任何设备 4.2 上重现。我在 genymotion 模拟器和装有 Android 4.2 的 DOOGEE 设备上安装了它。对于其他设备和模拟器,它按预期工作。
  • 我看到了你发给我的链接,它说如果我没有提供 x86 二进制文件,libhoudini 将在 x86 平台上用于将 arm 二进制文件转换为 x86 二进制文件。但我做到了,所以它甚至不应该调用 houdini。
  • 你的构建文件是什么?
  • 在加载自己的库之前尝试从 java 显式加载 opencv 库(如果它内部没有 jni 方法也没关系)。它可能会起作用,即使它不起作用,它也可能会给你一个更具体的错误消息,说明它为什么没有加载。

标签: android opencv android-ndk unsatisfiedlinkerror


【解决方案1】:

我找到了答案。分两步:

1/ 如果您使用的是 Genymotion 模拟器,Android 4.2.2,您将缺少一个库,这是由 Genimotion 的更新之一引起的。见this。 解决方案 : (1)> 下载以下 zip 文件:here。 (2)> 只需将其拖放到您的模拟器中。 (3)> 重启你的模拟器。

2/ 在 Android 4.2 中,操作系统在查找 apk 中附带的 jni 库的路径时遇到问题。例如,在我的例子中,我使用的是一个使用 openCV 库的 jni 库。 对于每个调用System.loadLibrary("mylib"); 的设备和android 版本都运行良好,mylib 会自动加载opencv 库。 对于 Android 4.2,正如@Chris 在他的评论中所说,我明确加载了 openCV,所以:

System.loadLibrary("opencv_java");
System.loadLibrary("mylib");

【讨论】:

  • 这两行你在哪里添加的?!
  • 代替 System.loadLibrary("mylib");
  • 我不明白!我的意思是我应该在哪里输入这些行?!活动?上课?我们只能在课堂上使用它有限制吗?
  • 你在哪里加载你的图书馆?如果您没有任何本机库来加载此问题,则答案与您的问题无关。现在,如果是,您有一个正在使用 ndk 构建的库(即 my_lib),并且您需要将它加载到某个地方(在类或活动中。在我的情况下,在应用程序类中),通常的方法是 @ 987654326@。现在,如果您通过本机库使用 openCV,则需要使用此答案来修复 kitkat 问题。
  • 我在应用加载 attachBaseContext() 时添加了它,它对我有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多