【发布时间】:2018-02-06 18:10:47
【问题描述】:
我有一个非常简单的安卓应用。我想加载一个名为“libcamera.so”的共享库,然后通过 JNI 调用方法。 我不拥有这个库,也无权访问源代码。它最初是为 ARM 编译的。 x86 版本不可用。
项目可以检测到该库并正确显示在 jniLibs 文件夹中。
在我的主要活动中,我尝试像这样加载第 3 方库:
static {
System.loadLibrary("camera");
}
当这一行执行时,logcat 显示如下:
02-06 14:11:38.517 4455-4455/uk.co.test.myApp E/art: dlopen("/data/app/uk.co.test.myApp-2/lib/x86/libcamera.so", RTLD_LAZY) failed: dlopen failed: "/data/app/uk.co.test.myApp-2/lib/x86/libcamera.so" has unexpected e_machine: 40
02-06 14:11:38.519 4455-4455/uk.co.test.myApp E/AndroidRuntime: FATAL EXCEPTION: main
Process: uk.co.test.myApp, PID: 4455
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/uk.co.test.myApp-2/lib/x86/libcamera.so" has unexpected e_machine: 40
at java.lang.Runtime.loadLibrary(Runtime.java:371)
at java.lang.System.loadLibrary(System.java:988)
at uk.co.test.myApp.MainActivity.<clinit>(MainActivity.java:17)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1603)
at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5258)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
使用此库的其他 3rd 方应用程序可以在我的 x86 设备 (Epson BT350) 上运行,所以我觉得这应该是可能的。 我已经意识到一个叫做“Houdini”的东西,它允许 ARM 应用程序在 x86 上运行——我已经检查过,我的设备有这个库,所以我很困惑为什么它不做它的工作。但我也很可能不太了解 Houdini 的工作原理!
我尝试在 x86 模拟器上运行 - 同样的错误。
任何想法将不胜感激。
【问题讨论】:
-
您的 APK 是否包含 lib\x86 下相同 (armeabi) libcamera.so 的单独副本?如果是这样,您是否尝试过不添加额外的副本? (即仅在 lib\armeabi 或 lib\armeabi-v7a 中提供库)。
-
很遗憾没有!只有 armeabi
标签: android x86 arm java-native-interface shared-libraries