我正在运行时像这样加载本机库
dlopen("mylib.so", RTLD_LAZY);
这在最新版本的android(例如,棉花糖,牛轧糖等)上正常运行。但是,在旧版本(例如Jellybean)上,此操作将失败,并在logcat中显示以下消息
Failed to load mylib.so. Error: Cannot load library:
load_library[1093]: Library 'mylib.so' not found
我确保mylib.so
是apk的一部分。我将其作为x86
和armeabi_v7a
体系结构的一部分。
myapp.apk
- lib
- armeabi-v7a
mylib.so
- x86
mylib.so
根据readelf -d mylib.so | grep NEEDED
,依赖性为
0x00000001 (NEEDED) Shared library: [liblog.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x00000001 (NEEDED) Shared library: [libc.so]
我尝试在加载dlopen
之前通过mylib.so
加载这些依赖项。尽管成功加载了这些依赖项,但加载mylib.so
总是失败,并出现相同的错误。
如前所述,我仅在旧版本的android上看到此失败。
我该如何使用它?预先感谢您的帮助。
答案 0 :(得分:3)
棒棒糖之前,您必须提供 dlopen()的完整路径。可以使用getApplicationInfo().nativeLibraryDir
在Java中获得此路径。
无论如何,您可以检查 /data/data/your.package/lib 目录的内容(有时后缀为-1
,或者以 / data / app-lib )。该目录是世界可读的目录,因此您应该从Android Studio或adb shell
中看到文件 libmylib.so 。
观察到此行为的另一个原因可能是较旧的设备不支持 armeabi-v7a ABI。使用adb shell getprop
可以轻松地进行检查。
此外,请确保使用正确的APP_PLATFORM
(应为match the minSdkVersion)构建库。
幸运的是,您的库没有“私有”依赖项。但是对于那些这样做的人,您也需要考虑到这一点。在 Lollipop 之前,这些依赖项不会自动加载(因为未扫描nativeLibraryDir
的 dlopen )。您必须以相反的依赖关系顺序加载所有库。
答案 1 :(得分:0)
尝试将文件夹名称从lib
更改为jniLibs
。