关于ZAKER 融媒体解决方案 合作 加入

android – dalvik.system.PathClassLoader 在 Intel 设备 .

CocoaChina 10-22

我遇到的问题是 dalvik.system.PathClassLoader 无法在 Intel 设备上找到我的 jni 文件 . 我认为它与我所拥有的 aar 依赖的结构有关 , 因为一旦我删除了该依赖项 , 就会发现 jni 文件没有问题 . 我的 aar 依赖有 x86 和 arm 库 , 我的项目只有 arm 库 .

文件夹结构是:

我的项目

我的 AAR 依赖项目有:

使用该结构 , 将无法在 x86 设备上找到 libLibraryA.so. 我不确定这是否是一个 gradle 打包问题 , 或者这是否是 dalvik / runtime 问题 . 我不知道下一步该往哪里去 . 我得到的错误是:

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 文件夹以便在 intel 设备上使用是否安全 , 还是会破坏运行时转换?我在 Nexus 播放器上看到了无法读取我们的 arm 编译库的问题 .

最佳答案

你可以混合为 x86 编译的库和只有彼此不依赖的 arm ( 即如果他们不通过 Java 直接相互调用 ) .

因此 gradle 不会混合使用针对不同体系结构的库 , 实际上你有责任这样做 , 最简单的方法就是将 libLibraryA.so 复制到 x86 文件夹 .

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

更新:正如我在下面的评论中所述 ,Android 5.0 不再支持从应用程序的 x86 文件夹加载 arm lib.

以上内容由"CocoaChina"上传发布 查看原文

觉得文章不错,微信扫描分享好友

扫码分享