项目里使用了jni,运行app时,进入jnilibs去读取库文件时应用未启动。最后查看发现一个头大的问题(java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList)
首先说说jni中arm64-v8a,armeabi-v7a,armeabi文件夹的用法
jnilibs去读取库文件的顺序
arm64-v8a是可以向下兼容的,其下有armeabi-v7a,armeabi
armeabi-v7a向下兼容armeabi
各文件夹区别
armeabi就是针对普通的或旧的arm cpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu。
android从2.2开始支持armeabi-v7a
最后找到的解决方法
从兼容性和性能上考虑
为了避免引用的第三方库中有arm64-v8a的so文件导致64位机器仍然从arm64-v8a文件夹读取so文件,将非armeabi-v7a的so文件全部过滤掉:加入ndk .abiFilters
defaultConfig {
applicationId "xx.xx.x.xx"
......
ndk {
abiFilters "armeabi-v7a" // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,armeabi,arm-v8之类的so会被过滤掉)
}
}
暴力解决
1、删除 armeabi-v7a文件
2、把armeabi *.so的文件复制一份放在armeabi-v7a运行测试通过,
原因: 在编译的时候如果v7a和调试模式的.SO文件不一样造成,但是一般开发 用发行模式一个文件夹就足以,特殊情况例外。