**
Android studio加载libpocketsphinx_jni.so库文件常见报错
**
报错一:couldn’t find “libpocketsphinx_jni.so”
- .so库文件推荐存放在main/jniLibs下,即可使用存放在libs文件夹下需要在build.gradle配置;
存放在libs文件夹下需要在build.gradle配置
- 不同CPU架构下so文件兼容问题
- 模拟器常用的x86支持armeabi,armeabi-v7a
jniLibs目录下
i. 如果存在/x86/.so文件,优先加载此文件
ii. 如果不存在x86文件,会选择armeabi-v7a下的.so文件
iii. 如果也不存在armeabi-v7a文件,会选择armeabi下的.so文件 - 现在大部分安卓手机常用的armeabi-v7a支持armeabi,armeabi-v7a
jniLibs目录下
i. 如果存在/armeabi-v7a/.so文件,优先加载此文件
ii. 如果不存在armeabi-v7a文件,会选择armeabi下的.so文件
所以build.gradle下ndk只添加armeabi,armeabi-v7a两项就可以
(ndk 开发C/C++动态库,自动将abiFilers配置架构下的.so文件和java应用程序打包到APK中,APK中lib文件夹下会有相应的.so文件)
报错二:lib/arm/libpocketsphinx_jni.so" has text relocations
原因:安卓6以上targetSdk>=23, 系统将会拒绝加载包含text relocations的共享库,同时输出错误Log
解决:版本改为22 (网上说真正的解决方案就是解决so动态链接库中的text relocations (TEXTRELs)问题)
报错三:找不到.so库方法
原因:so库里的接口都是带包名的,如果从别的项目拷贝过来,包名变了而.so库里的接口包名没变,就会造成找不到jni方法的异常。
解决:保持so库的包结构不变