gpt4 book ai didi

android - dlopen 在较旧的 Android 版本上失败

转载 作者:行者123 更新时间:2023-11-29 16:40:13 27 4
gpt4 key购买 nike

我在运行时像这样加载我的原生库

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 依赖项是

 0x00000001 (NEEDED)                     Shared library: [liblog.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x00000001 (NEEDED) Shared library: [libc.so]

我尝试在加载 mylib.so 之前通过 dlopen 加载这些依赖项。虽然加载这些依赖项成功,但加载 mylib.so 总是失败并出现相同的错误。

如前所述,我只在旧版本的 android 上看到此故障。

我怎样才能让它发挥作用?在此先感谢您的帮助。

最佳答案

Lollipop 之前,您必须提供 dlopen() 的完整路径。可以在 Java 中使用 getApplicationInfo().nativeLibraryDir 获取此路径。

无论如何,您可以检查/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 .

幸运的是,您的库没有“私有(private)”依赖项。但对于那些这样做的人,你也需要考虑到这一点。在 Lollipop 之前,这些依赖项不会自动加载(因为 nativeLibraryDir 没有扫描 dlopen)。您必须以反向依赖顺序加载所有库。

关于android - dlopen 在较旧的 Android 版本上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982902/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com