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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值