如何在android 2.1上从sd卡加载jni?

如何在android 2.1上从sd卡加载jni?,android,java-native-interface,native-code,Android,Java Native Interface,Native Code,我想在运行时加载第三方jni库。 我已尝试直接从SD卡加载。它预期会失败。 我已尝试将库从SD卡复制到/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)下不起作用 Android的

我想在运行时加载第三方jni库。
我已尝试直接从SD卡加载。它预期会失败。
我已尝试将库从SD卡复制到/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)下不起作用


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


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

您无法在生产设备上读取或写入
/data/data/libjni.so
文件。是的。您可能希望将其复制到应用程序安装目录中的“lib”目录。好的一面是,应用程序的类加载器会自动找到它,因此您可以使用System.loadLibrary()而不是System.load()。很抱歉出现了问题。不幸的是,我没有在运行时从应用程序写入/data/data/app/lib的权限。我试过了,但在尝试创建新文件时遇到了FileNotFoundException。我试过了,但得到的结果是“.so”文件具有糟糕的精灵魔法”。有什么帮助吗?
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");