如何从SD卡中加载JNI在Android 2.1?
-
26-09-2019 - |
题
我想在运行时加载第三方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()。
不隶属于 StackOverflow