dlopen在较旧的Android版本上失败

时间:2018-06-22 07:33:34

标签: android android-ndk dlopen

我正在运行时像这样加载本机库

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的一部分。我将其作为x86armeabi_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上看到此失败。

我该如何使用它?预先感谢您的帮助。

2 个答案:

答案 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

相关问题