【问题标题】:Android app loading ARM shared library on x86 device fails在 x86 设备上加载 ARM 共享库的 Android 应用程序失败
【发布时间】: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


【解决方案1】:

我通过强制我的应用只构建 armeabi 版本解决了这个问题。我通过在 gradle 中使用 abifilter 来做到这一点。我将以下内容添加到我的默认配置中

ndk {
    abiFilters "armeabi"
}

这将在我的 x86 设备上运行,因为 Houdini 将启动并进行翻译。它并不理想,因为这种翻译会影响性能 - 但它是一个开始,让我进入下一个阶段。

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 2013-05-25
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多