Exception-so库找不到

运行时异常:

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

这是在使用so库时,因为找不到,类似的有关so库找不到的问题还有如下图中异常信息

cpu相关概念

CPU类型

要解决类似问题,就要了解一下cpu相关的概念,如下。
Android设备的CPU类型,通常称为ABIs
1.armeabiv-v7a:第7代及以上的ARM处理器,2011年以后生产的大部分Android设备都用它;
2.arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
3.armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
4.x86: 平板、模拟器用得比较多。
5.x86_64: 64位的平板。

arm64-v8a与armeabi关系:

arm64-v8a是可以向下兼容的,但前提是你的项目里面没有arm64-v8a的文件夹,如果你有两个文件夹armeabi和arm64-v8a,两个文件夹,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手机在用到b的时候发现有arm64-v8a的文件夹,发现里面没有b.so,就报错了,所以这个时候删掉arm64-v8a文件夹,这个时候手机发现没有适配arm64-v8a,就会直接去找armeabi的so库,所以要么你别加arm64-v8a,要么armeabi里面有的so库,arm64-v8a里面也必须有
作者:green jim
链接:http://www.zhihu.com/question/36893314/answer/78467097

x86、armeabi-v7a与armeabi

当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。在x86设备上,libs/x86目录中如果存在.so文件的话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件

解决方案

选择armaebi目录

根据上述armebi目录调用顺序和关系,
要么将各个目录都放入相应位数的so文件;
或者是删除某个目录,eg.arm64-v8a。

显示指定支持的ABIs

另外一种解决方案, 显示指定支持的ABIs。

android{
defaultConfig {
ndk { abiFilters “armeabi”, “armeabi-v7a” }
}
}
这种强制使用指定ABIs的方式暂时不推荐,因为不同cpu读取适合自己的.so库,有助于计算速度的提升。强制cpu使用上述目录下的so库,有可能造成性能上的损耗,但能解决该异常。

参考

http://blog.csdn.net/ouyang_peng/article/details/51168072
google DOC:https://developer.android.com/ndk/guides/abis.html?hl=zh-cn

有关so文件还有很多东西,自行查阅,未完待续….

Fork me on GitHub