Android :couldn't find "libnative-lib.so

 项目中经常会使用.so文件封装或者调用,但是不小心也会掉到坑里去,之前遇到过一次,这次又遇到了,记下来做个笔记。

异常情况如下,有时候当你把调用架包导入之后,还是会出现问题,提示无法找到:

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

这是因为Android中支持不同的平台类型如:

'armeabi' , 'armeabi-v7a' , 'arm64-v8a' , 'x86' , 'x86_64',但是有的时候我们不会再每个文件中都添加要导入的架包,那么问题就来了,我们都知道'x86'是32位多用于平板,'x86_64'多用于64位平板,'armeabi'第5代、第6代的ARM处理器,多用于早期手机, 'armeabi-v7a' 是第7代及以上的 ARM 处理器,目前大部分手机使用, 'arm64-v8a'是第8代、64位ARM处理器,很少设备使用。

而一般情况下,这些是可以向下兼容的,而这却是导致问题的原因,当我们存在这些文件,而我们在其他文件中都要导入架包而在 'arm64-v8a'中只有部分导入,那么当我们运行程序的时候就会出现  couldn't find "libnative-lib.so"的情况,因为没有走到存在架包所在的包的文件。

而想要解决问题也很简单,只需要在每个文件中都添加架包,如果不存在或者没有,则可以直接从存在的文件中复制导入即可。

但是这样这样就好出现我们用不到的文件,如果打包的话,apk就会很大。所以一般情况下我们只需要把文件全部保留,只需要根据实际情况使用,一般我们回保留 'armeabi-v7a' 文件夹就可以兼容大部分手机,或者我们也可以在app的build.gradle文件中添加过滤

defaultConfig {
        minSdkVersion 19
        targetSdkVersion 28

        ndk.abiFilters 'armeabi-v7a'
    }

这样我们就可以过滤到其他不需要的文件,减小打包文件的大小。

过滤我们可以添加多个文件  ndk.abiFilters 'armeabi' , 'armeabi-v7a'