Android 5.1 加载 64 位共享库失败,因为它的依赖库没有找到,但它确实存在

标签 android load 64-bit shared-libraries

我遇到一个 android 5.1 64 位共享库加载问题。

系统:android 5.1。

我的apk将两个xx.so(libA.so & libB.so,libB.so depends on libA.so)压缩成一个原始文件来限制apk文件的大小,当启动时,应用程序将这个原始文件解压缩回原始文件libA.so 和 libB.so 到目录/data/data/MyApp/files/arm64-v8a ,现在应用程序通过传递绝对路径调用 System.load:

System.load("/data/data/MyApp/files/arm64-v8a/libA.so"); //Success
System.load("/data/data/MyApp/files/arm64-v8a/libB.so"); //Fail

如上评论,第一次加载libA.so成功,但加载libB.so失败,错误信息如下: dlopen("/data/data/MyApp/files/arm64-v8a/libB.so", RTLD_LAZY) 失败:dlopen 失败:找不到库“libA.so”。 但是/data/data/MyApp/files/arm64-v8a/libA.so 确实存在,可能不在正确的位置?

我测试过32位版本,不存在这个问题。 我也在另一台Android5.0系统的Sumsumg Galaxy S6上测试过,也不存在这个问题。

我试过将 libA.so 复制到/data/data/MyApp/lib,但出现权限拒绝错误。

有没有人遇到同样的问题或有解决这个问题的想法?

最佳答案

我在 64 位 LG G Flex 2 @ Android 5.0 上遇到了同样的问题。我猜这是另一个 Android 操作系统错误(gdb 显示 solist 数组可能在链接器中损坏),您可能需要使用 rpath ELF 属性作为解决方法(每当您将库移动到一个新的地方)。我建议您使用 loooooong rpath 重新编译您的库,以使修补更容易。您也可以尝试将 rpath 设置为“/data/data/MyApp/files/arm64-v8a/”

关于Android 5.1 加载 64 位共享库失败,因为它的依赖库没有找到,但它确实存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978714/

相关文章:

java - Android处理程序缩短延迟?

android - IntentService 注册回调

windows - 32 位用户模式驱动程序可以在 64 位操作系统上运行吗?

javascript - Jquery 在 .load() 之前显示图像

java - 无法在 64 位 java 程序中加载 64 位 DLL

c# - 32 位 dllimport 在 win7 x64 平台上生成不正确的格式错误 (0x8007000b)

java - 如何在 Android 中从 .txt 文件读取阿拉伯文本

java - 是否可以使用伴随对象扩展具有非空构造函数的类

Python PIL 加载抛出 AttributeError : 'NoneType' object has no attribute 'read'

html - IE6无法加载页面