赞
踩
问题描述:
在 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 生成代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。