【问题标题】:dalvik.system.PathClassLoader can't find jni on Intel devicesdalvik.system.PathClassLoader 在英特尔设备上找不到 jni
【发布时间】:2014-12-05 21:42:19
【问题描述】:

我遇到了一个问题,即 dalvik.system.PathClassLoader 在英特尔设备上找不到我的 jni 文件。我认为这与我拥有的 aar 依赖项的结构有关,因为一旦我删除了该依赖项,就会发现 jni 文件没有问题。我的 aar 依赖项有 x86 和 arm 库,而我的项目只有 arm 库。

文件夹结构为:

我的项目

    • jniLibs
      • armeabi
        • libLibraryA.so

我的 AAR 依赖项目有:

    • jniLibs
      • armeabi
        • libLibraryB.so
      • x86
        • libLibraryB.so

使用该结构,在 x86 设备上将找不到 libLibraryA.so。我不确定这是 gradle 打包问题还是 dalvik/运行时问题。我不知道下一步该去哪里。我得到的错误是:

  FATAL EXCEPTION: main 
  Process: com.project, PID: 10850 
 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/base.apk"],nativeLibraryDirectories=[/lib/x86, /vendor/lib, /system/lib]]] couldn't find "libLibraryA.so" 
 at java.lang.Runtime.loadLibrary(Runtime.java:366) 
 at java.lang.System.loadLibrary(System.java:989)`

我知道可以通过在我的项目中创建一个 x86 文件夹并将 libLibraryA.so 复制到其中来“修复”该问题。有谁知道 gradle 是否可以/应该为我处理这个?将 arm 编译的库放入 x86 文件夹以在英特尔设备上使用是否安全,否则会破坏运行时翻译?我在 Nexus Player 上看到了无法读取我们的 arm 编译库的问题。

【问题讨论】:

    标签: android gradle dalvik unsatisfiedlinkerror android-x86


    【解决方案1】:

    您可以混合为 x86 和 arm 编译的库,前提是它们不相互依赖(即,如果它们不通过 Java 直接相互调用)。

    所以 gradle 不会混合针对不同架构的库,这确实是您的责任,最简单的方法确实是将您的 libLibraryA.so 复制到 x86 文件夹。

    但这样做是一种解决方法,仅适用于基于 Intel 的零售设备。我不建议这样做:正确的做法仍然是获取为 x86 编译的 libLibraryA.so 版本并将其放入 x86 文件夹中。

    更新:正如我在下面的评论中所说,Android 5.0 不再支持从应用的 x86 文件夹加载 arm 库。

    【讨论】:

    • 感谢您解决这个问题。对于为什么 Nexus Player 没有读取我们的 libLibraryA,即使它位于 x86 文件夹中,您有任何想法吗?
    • 通常翻译工作正常,您能否提供有关哪个库出现故障和/或确切的行为/错误是什么的更多信息?有时,Lollipop 会导致库失败,因为 ART 在 JNI 使用方面比 Dalvik 更严格,不一定是因为 cpu 架构。
    • 我在运行 Lollipop 的 x86 设备上进行了进一步测试:这些平台不再支持从应用的 x86 文件夹加载 arm 库。
    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多