Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 5.1加载64位共享库失败,因为未找到其依赖库,但它确实存在_Android_Load_64 Bit_Shared Libraries - Fatal编程技术网

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

Android 5.1加载64位共享库失败,因为未找到其依赖库,但它确实存在,android,load,64-bit,shared-libraries,Android,Load,64 Bit,Shared Libraries,我遇到了安卓5.1 64位共享库加载问题 系统:安卓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.s

我遇到了安卓5.1 64位共享库加载问题

系统:安卓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
如上所述,首次加载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位版本,这个问题不存在。 我还在另一台设备上测试了这个问题,SumG Galaxy S6的系统是Android5.0,这个问题也不存在

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


有没有人遇到过同样的问题或者有什么想法来解决这个问题?

我在64位LG G Flex 2@Android 5.0上遇到过同样的问题。我猜这是安卓操作系统的又一个bug(gdb显示solist数组可能会在链接器中损坏),您可能需要使用rpath ELF属性作为解决方法(每当您将库移动到新位置时都会对其进行修补)。我建议您使用loooong 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 not dlopen。(很抱歉我的英语不好)