我想在运行时加载第三方JNI库。结果 我试过直接从SD卡加载。它果然失败了。结果 我试图从SD卡复制库/数据/数据/应用/然后点击 System.load(/data/data/app/libjni.so)结果 它适用于HTC HERO,但未能上的HTC Legend采用Android 2.1。 它的原生代码和写入执行过程中无法登录不提供信息的堆栈跟踪 任何其他办法做到这一点? 那是最好的一段代码,该作品在1.5(HTC Hero的),但DONOT作品在2.1(的HTC Legend)。

FileInputStream fis = new FileInputStream("/sdcard/libjni.so");
File nf = new File("/data/data/app/libjni.so");
FileOutputStream fos = new FileOutputStream(nf);
byte[] buf = new byte[2048];
int n;
while ((n = fis.read(buf)) > 0)
    fos.write(buf, 0, n);
fis.close();
fos.close();
System.load("/data/data/app/libjni.so");
有帮助吗?

解决方案

Android的动态加载器无法加载从SD卡的文件系统可执行代码,因为它被标记为不可执行,你不能映射来自非可执行存储可执行存储器页面。 (理论上,你可以手动将内容复制到可执行匿名映射的网页,但是这是丑陋的。安装在SD的Android支持的应用程序版本的可执行文件系统包含在SD卡一个文件中,但第三方应用程序不能写那些)

但你可以做的是一个图书馆写在内部的存储的可写位置 - 而不是lib目录到您没有写权限,但一个又一个从Context.getDir发现( )或Context.getFilesDir(),然后使用全路径和使用System.load(.so文件名加载)代替的System.loadLibrary()。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top