如何解决 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

当在Android NDK项目中遇到`UnsatisfiedLinkError`,提示找不到`libexample.so`时,原因是缺少对应CPU架构的库。虽然arm64-v8a设备理论上兼容armeabi-v7a,但系统会优先查找64位库。为解决此问题,需要在Module的`build.gradle`文件中指定仅支持armeabi-v7a架构,添加`abiFilters armeabi-v7a`,确保在编译时只打包armeabi-v7a的so文件。

问题描述:
在 ndk 项目中,运行时出现 crash,报错信息为:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.example.app1-N8QaCmB1BIy_61rNltnmmQ==/base.apk”],nativeLibraryDirectories=[/data/app/com.example.app1-N8QaCmB1BIy_61rNltnmmQ==/lib/arm64, /data/app/com.example.app1-N8QaCmB1BIy_61rNltnmmQ==/base.apk!/lib/arm64-v8a, /system/lib64, /hw_product/lib64, /system/product/lib64]]] couldn’t find “libexample.so”

问题分析:
当报错信息为:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file ]]] couldn’t find “xxx.so"时,是因为so文件加载异常。根据日志的描述:设备的 cpu 架构是 arm64-v8a,但是在/lib/arm64-v8a路径下没有找到"xxxxx.so”,所以运行时闪退了。项目中jni目录下只有 armeabi-v7a 的so文件,但是64位的设备应该是兼容32位的库的呀?
这是因为 arm64-v8a 的手机在用到该app的时候会优先查找 arm64 的文件夹,发现里面没有 libexample.so,就报错了,所以在编译的时候应该设置只兼容 armeabi-v7a 架构,这样在运行的时候,就会直接去加载 armeabi-v7a 的so库了。

解决方案:
在 Module 的 build.gradle 文件中添加如下代码:

android {
    defaultConfig {
        // 指定兼容的cpu架构
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

Android 开发者官网说明:为特定 ABI 生成代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ByteSaid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值