【发布时间】:2020-07-24 04:39:49
【问题描述】:
我正在开发一个使用 c++ 共享库的 Android 应用程序。最初,该项目运行良好。我最近将 Android Studio 升级到了 4.0.1 版。我也将我的 Gradle 版本更新为 4.x,但更新后出现奇怪问题,因此将 Gradle 版本改回 3.6.3。
代码运行到语句时
try{
System.loadLibrary("something");
} catch(Exception e) {...}
应用程序抛出异常
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN3Eld12PtrModelRefsEv" referenced by "/data/app/com.myapp-aXvdrU70cJvaDOn1c13zEQ==/lib/arm/libsomething.so"...
在apk文件中,我可以看到库二进制文件位于
apk/debug/app-armeabi-v7a-debug.apk/lib/armeabi-v7a/libsomething.so
该应用似乎正在尝试从 lib/arm 而不是 lib/armeabi-v7a 加载共享库
在文件夹something 下,我有文件build.gradle 配置如下:
android {
defaultConfig{
ndk {
abiFilters "armeabi-v7a"
}
}
}
使用readelf -A libsomething.so 检查我的库文件属性。我有以下结果
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "ARM v7"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3
Tag_Advanced_SIMD_arch: NEONv1
Tag_ABI_PCS_GOT_use: GOT-indirect
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_enum_size: int
Tag_CPU_unaligned_access: v6
Tag_ABI_FP_16bit_format: IEEE 754
我尝试使用System.setProperty("java.library.path", "lib/armeabi-v7a"); 更改库加载路径。但它不会改变任何东西。
那么,我怎样才能让函数System.loadLibrary从正确的位置加载二进制库文件呢?
Android Studio 版本:4.0.1
Android Gradle 插件版本:3.6.3
Gradle 版本:6.3
【问题讨论】:
标签: c++11 android-ndk shared-libraries