【发布时间】:2012-10-04 02:33:59
【问题描述】:
我有一个 android 应用程序,它生成许多与我随包分发的库动态链接的本机可执行文件。 要启动这些二进制文件,我使用 LD_LIBRARY_PATH 环境变量让它们知道从中加载库的位置,但在某些设备上这根本不起作用,LD_LIBRARY_PATH 已正确更新,但二进制文件无论如何都找不到库. 这不是我可以重现的东西,因为在我的两台设备上(Galaxy Nexus 和 Nexus 7 with stock roms)它运行良好。
我尝试了很多方法,例如我生成:
LD_LIBRARY_PATH=/my/package/custom/libs:$LD_LIBRARY_PATH && cd /binary/directory && ./binary
还有:
String[] envp = { "LD_LIBRARY_PATH=" + libPath + ":$LD_LIBRARY_PATH" };
Process process = Runtime.getRuntime().exec( "su", envp );
writer = new DataOutputStream( process.getOutputStream() );
reader = new BufferedReader( new InputStreamReader( process.getInputStream() ) );
writer.writeBytes( "export LD_LIBRARY_PATH=" + libPath + ":$LD_LIBRARY_PATH\n" );
writer.flush();
但是在那些设备上似乎没有任何工作......所以我开始认为这是一个与内核相关的问题,一些内核(比如我的)使用 LD_LIBRARY_PATH,其他内核不使用(简单地忽略它,或者他们只使用在应用程序启动时设置的 LD_LIBRARY_PATH,因此无法在运行时更改它)。
我也尝试使用 System.load 但它不起作用,可能是因为这些库不是 JNI ...在开始考虑使用静态链接的二进制文件之前我可以尝试什么吗?
【问题讨论】:
-
>>但是在某些设备上这根本不起作用,你能提供我不起作用的设备型号吗?不确定是否有帮助,但请尝试查看(如果我有这样的设备)。
-
它是处理 LD_LIBRARY_PATH 的链接器 // github.com/android/platform_bionic/tree/master/linker
标签: java android android-ndk shared-libraries native