我在一个项目中使用本地库已有很长时间了,并且一切正常。现在,我正在使用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.
,但我看到它存在了很长时间,而且并不是什么新鲜事物。
答案 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目录结构来确认此猜测。