Как загрузить JNI с SD-карты на Android 2.1? - PullRequest
2 голосов
/ 13 мая 2010

Я хочу загрузить стороннюю библиотеку jni во время выполнения.
Я пытался загрузить напрямую с SDCard. Как и ожидалось, не удалось.
Я пытался скопировать библиотеку из SDCard в / data / data / app /, а затем
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");

1 Ответ

3 голосов
/ 29 июля 2011

Динамический загрузчик Android не может загрузить исполняемый код из файловой системы SDCard, поскольку он помечен как неисполняемый, и вы не можете отобразить страницы исполняемой памяти из неисполняемого хранилища. (Теоретически вы можете вручную скопировать содержимое на исполняемые анонимные сопоставленные страницы, но это ужасно. Версии приложений, поддерживающих Android на SD, монтируют исполняемые файловые системы, содержащиеся в файле на SD-карте, но стороннее приложение не может их записать)

Но вы можете записать библиотеку в доступное для записи место в внутреннем хранилище - не в каталог lib, к которому у вас нет прав на запись, а в другой, найденный из Context.getDir () или Context.getFilesDir () и затем загрузите его, используя полный путь и имя файла .so, используя System.load () вместо System.loadLibrary ().

...