--Android引用so文件引发的血案

项目里使用了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文件不一样造成,但是一般开发 用发行模式一个文件夹就足以,特殊情况例外。

 

 

你可能感兴趣的:(Android)