为什么添加abiFilters可以使应用正常运行?

时间:2018-10-25 15:35:19

标签: android android-ndk android-gradle

我在一个项目中使用本地库已有很长时间了,并且一切正常。现在,我正在使用Android Studio 3.2.1和Graddle 4.6

正如我所说,一切都好了很长时间。现在,我做了一些更改并重新构建了一个新的apk,在运行时,在System.loadLibrary("mylibrary")上出现了此错误:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[...]couldn't find "mylibrary.so"

在我的项目结构中,我有jniLibs\armeabi\mylibrary.so

因此,我开始搜索那个UnsatisfiedLinkError以及什么可能导致它突然出现。

使apk正常运行的解决方案是在我的gradle文件中添加:

ndk{
  abiFilters "armeabi"
}

我不明白为什么上个月可以使用它,现在却不可以?事情发生了什么变化?另外,有人可以解释abiFilters的确切作用吗?在他们的文档中它写着Specifies the Application Binary Interfaces (ABI) that Gradle should build outputs for and package with your APK.,但我看到它存在了很长时间,而且并不是什么新鲜事物。

2 个答案:

答案 0 :(得分:0)

您的so文件缺少前缀'lib',jniLibs\armeabi\mylibrary.so should be

jniLibs\armeabi\libmylibrary.so

答案 1 :(得分:0)

我假设您使用默认构建工具版本,例如NDK r18,适用于Android Studio 3.2.1。因为 armeabi 自NDK r17起已被删除。

  

在我的项目结构中,我有jniLibs \ armeabi \ mylibrary.so。

尝试考虑将本机代码迁移到那些新的ABI。请参阅:https://developer.android.com/ndk/guides/abis


abiFilter下面将强制您的APK仅对armeabi进行打包{strong> ,此ABI将成为所有设备的主要ABI选择。

ndk{
  abiFilters "armeabi"
}

换句话说,无论您的设备是arm64-v8a还是armeabi-v7a,APK管理器都会从<your-apk-path>/lib/armeabi/...提取本机库。因此,请从Android Studio中尝试“ 构建”->“ 分析APK ”,通过检查您的APK目录结构来确认此猜测。