我遇到的问题是dalvik.system.PathClassLoader无法在英特尔设备上找到我的jni文件。我认为它与我所拥有的aar依赖的结构有关,因为一旦我删除了该依赖项,就会发现jni文件没有问题。我的aar依赖有x86和arm库,我的项目只有arm库。
文件夹结构为:
我的项目
- SRC
- jniLibs
- armeabi
- libLibraryA.so
我的AAR依赖项目有:
- SRC
- jniLibs
- armeabi
- libLibraryB.so
- 86
- libLibraryB.so
使用该结构,将无法在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编译库的问题。
答案 0 :(得分:2)
如果它们不相互依赖(即,如果它们不通过Java而不直接相互调用),则可以混合为x86编译的库和仅用于arm的库。
因此,gradle不会混合使用针对不同体系结构的库,实际上您有责任这样做,最简单的方法就是将libLibraryA.so
复制到x86文件夹。
但这样做是一种解决方法,它只适用于基于Intel的零售设备。我不建议这样做:正确的做法仍然是为x86编译libLibraryA.so
版本并将其放入x86文件夹中。
更新:正如我在下面的评论中所述,Android 5.0不再支持从应用程序的x86文件夹加载arm lib。