java.lang.UnsatisfiedLinkError:找不到so等等的排查经过

1,341 阅读1分钟

问题发生:

本来数据库用的room,发现greendao作者写了个objectbox,就导入项目玩玩,结果发生了上述问题。

排查:

  1. 首先检查安装文件里有没有这个so文件,adb shell 进入设备,在data/data/包名/lib下果然有一些其他的so,但是没有报错的那个so。好的,问题发现。
  2. 既然没有安装,那么打包有没有出问题呢?找到apk文件,打开,在lib中有arm、armv7、armv8等。报错的so在arm里有,在armv7、armv8里都没有。OK,问题定位了。

设备是armv7的,之前用的数据库框架room是google对sqlite的一些封装,没有引入so,打包后只有arm,兼容几乎所有android设备,故没有报错。引入objectbox后,作者认为arm已过时没有支持,而且也不是我手动引入的,是在build.gradle里通过插件引入的,也没有感知到这个问题。所以打包后有arm、armv7、armv8等,而设备是v7的,在安装的时候就只将armv7安装了进去,导致了报错。

解决:

在module的build.gradle下对ndk支持限定只支持armv7

defaultConfig {
        applicationId "com.optimais.scales"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk {
            abiFilters 'armeabi-v7a'    //只生成armv7的so
        }
    }

再将报错第三方库的jnilib里的arm文件夹更名为armeabi-v7a即可。(他没提供v7,只能这么解决了)