【问题标题】:Android 5.1 load 64 bits shared library failed due to its depend library not found but it indeed existsAndroid 5.1 加载 64 位共享库失败,因为它的依赖库未找到但它确实存在
【发布时间】:2015-11-05 20:37:29
【问题描述】:

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

系统:android 5.1。

我的 apk 将两个 xx.so(libA.so & libB.so,libB.so 依赖于 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

和上面的cmets一样,第一次加载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位版本,不存在这个问题。 并且我也在另一台设备Sumsumg Galaxy S6 系统Android5.0 上测试过,也不存在这个问题。

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

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

【问题讨论】:

    标签: android load 64-bit shared-libraries


    【解决方案1】:

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

    【讨论】:

    • 更改rpath后仍然失败。:(
    • 什么是使用 rpath ELF 属性作为解决方法?比如,有链接之类的吗?
    • @er0 也许我以后可以写博客。这是不正常的方式。
    • @kangear 在您撰写该博客之前,介意分享一些有关您的解决方案的提示吗?您最终是否直接在本机代码中调用 dlopen()?
    • @er0 也许这是一个操作系统错误,但我试图适应这个错误。 A 作为 1.SO,A & B 作为 2.SO,加载 1.so,然后加载 2.so,没有依赖问题,一切正常。加载使用 System.load 不是 dlopen。 (对不起我的英语不好)
    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 2012-06-19
    • 2012-02-24
    • 2011-11-07
    • 2023-02-12
    • 2014-01-22
    • 2011-04-08
    • 2011-10-01
    相关资源
    最近更新 更多