2

我想在运行时加载第三方 jni 库。
我试图直接从 sdcard 加载。预计失败了。
我尝试将库从 sdcard 复制到 /data/data/app/,然后
System.load(/data/data/app/libjni.so)
它适用于 HTC HERO,但在 HTC Legend 与 Android 2.1 上失败。它在执行本机代码期间失败并写入日志无信息堆栈跟踪还有其他方法吗?这是最好的代码,适用于 1.5(HTC Hero),但不适用于 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");
4

1 回答 1

4

Android 的动态加载器无法从 sdcard 的文件系统加载可执行代码,因为它被标记为不可执行,并且您无法从不可执行存储映射可执行内存页面。(理论上你可以手动将内容复制到可执行的匿名映射页面中,但这很丑陋。支持 SD 上的应用程序的 android 版本会挂载包含在 sdcard 上的文件中的可执行文件系统,但第三方应用程序不能编写这些)

但是您可以做的是将库写入内部存储中的可写位置 - 不是您没有写入权限的 lib 目录,而是从 Context.getDir() 或 Context.getFilesDir() 找到的另一个目录,然后加载它使用完整路径和使用 System.load() 而不是 System.loadLibrary() 的 .so 文件名。

于 2011-07-29T16:38:43.027 回答