UnsatisfiedLinkError、couldn't find "xxx.so"

相关环境仅作参考

android 6.0.1
cpu 高通骁龙625 8核 2.0G
gradle 3.3
com.android.tools.build:gradle 2.2.3

错误日志:

java.lang.UnsatisfiedLinkError: 
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.telecom.video-1/base.apk"],
nativeLibraryDirectories=[/data/app/com.telecom.video-1/lib/arm64, /data/app/*packagename*-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] 
couldn't find "libijkffmpeg.so"

分析

项目目录中的仅配置了armeabi-v7a目录

../lib
    |-armeabi-v7a
            |-libijkffmpeg.so
            |-..

从日志中看到虚拟机加载了/lib/arm64 和 /lib/arm64-v8a,没有/lib/armeabi-v7a,不科学啊

对生成的apk分析

apk中lib/
      |-armeabi-v7a
          |-libijkffmpeg.so
          |-libsophix
          |-..
      |-x86_64
          |-libsophix
      |-arm64-v8a
          |-libsophix
      |-armeabi
          |-libsophix
      |-x86
          |-libsophix

发现存在多个cpu兼容目录,而我们只兼容armeabi-v7a,根据apk发现其中的libsophix是项目中的一个依赖其包含了多个兼容库被一起打包到了apk中,这里根据项目的情况只想要一个兼容库。

解决

我在build.gradle中这样配置,增加了过滤设置cpu兼容:

android {
    defaultConfig {
        ndk {
            abiFilter "armeabi-v7a" //, "armeabi", "x86" 按需设置
        }
    }
}

然后再次分析apk,其仅兼容armeabi-v7a了:

apk中lib/
      |-armeabi-v7a
             |-libijkffmpeg.so
             |-libsophix.so
             |-..

虚拟机加载so库时,如果发现arm64-v8a目录,就只加载arm64-v8a目录(但是为啥还有个arm64目录?)
arm64-v8a中显然没有目标so,所以报错。其实还可以将armeabi-v7a中的so文件copy到arm64-v8a中,但不是个好方法,因为我们的目标是兼容armeabi-v7a,不同的cpu版本有不同的开发接口。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值