一、为什么会出现这样的报错?
引用了一些第三方的sdk的so库之后通常都会遇到这样的错误,(“nativeLibraryDirectories=”[/data/app/com.lukouapp-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libxxxx.so")。
手机的机型不同,so库开发公司也各不相同,有的so库兼容各种机型,兼容android api 17~28,有的so库只支持api>21 ,下面分情况总结:
1.android系统支持七种不同的cpu架构:ARMv5(armeabi.so),ARMv7(从2010年起)(armeabi-v7a.so),x86 (从2011年起)(x86.so),MIPS (从2012年起)(mips.so),ARMv8(arm64-v8.so,高端机),MIPS64(mips64.so)和x86_64(x86_64.so) (从2014年起),每一种都关联着一个相应的ABI(Application Binary Interface应用二进制接口=编译好的二进制so库文件)
【armeabi,armeabi-v7a,x86,mips,arm64-v8a(64位设备),mips6464位设备),x86_6464位设备)这些都是指令集的统称】
mips和mips_64:MIPS架构是一种高性能的嵌入式CPU构架,其出发点是高性能,主要用于路由器、猫等
X86(32位),x86_64(64位)(该芯片由美国intel英特尔公司生产) 该构架的处理器已经广泛运用在PC领域,
armeabi,armeabi-v7a,arm64-v8a(都采用ARM架构,该芯片由英国ARM公司生产)全世界超过95%的智能手机和平板电脑都采用ARM架构,大部分android手机都是ARM架构的
二、解决办法:
所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,armeabi-v7a 向下兼容 armeabi (大部分机器都属于armeabi-v7a),所以为减少apk的大小,一般一个armeabi-v7a.so就够了。第三方的sdk,提供了多少so库 ,你最好将它提供的都拷贝到项目中。
android 最好放在main/jniLibs(main下面没有jniLibs,就自己建一个)目录下,这样一般不会出问题,不建议自己指定ABI的路径。
so库文件里面大都是c/c++编写的代码,他们暴露原生native接口时需要指定应用的包名,故有些so库文件需要应用的包名要与so库开发商给出的包名一致,【这一点开发商给的文档里一般都会说明,文档里没有,则可以忽略这个因素】
有的so库支持android api 17~28,有的so库只支持api>21的(如虹软的ArcFace的sdk的so库),当api较低的手机遇到这种情况时,最好拿api较高的,或别的手机测试一下,也可咨询一下开发商,该so库文件支持的手机api的版本
如果将so库文件放在libs下,则需要在build.gradle中的android节点下面配置如下代码
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
三、总结:
有些文件是要存放在libs和jniLibs中的这两个文件不是自动生成的要自己手动创建。
还有jniLibs中的这三个文件
希望可以帮到你。