Как загрузить JNI с SD-карты на Android 2.1?

Я хочу загрузить стороннюю библиотеку 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).

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");

person Aleksei Potapkin    schedule 13.05.2010    source источник
comment
У вас нет возможности читать или записывать файл /data/data/libjni.so на рабочем устройстве.   -  person CommonsWare    schedule 13.05.2010
comment
Ага. Вы хотите скопировать его в каталог lib в каталоге установки приложения. Положительным моментом является то, что загрузчик классов приложения найдет его автоматически, поэтому вы можете использовать System.loadLibrary() вместо System.load().   -  person fadden    schedule 14.05.2010
comment
Извините за ошибки в вопросе. К сожалению, у меня нет прав на запись в /data/data/app/lib из моего приложения во время выполнения. Я пытался, но получил исключение FileNotFoundException при попытке создать новый файл.   -  person Aleksei Potapkin    schedule 14.05.2010


Ответы (1)


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

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

person Chris Stratton    schedule 29.07.2011
comment
Я пробовал это, но все, что я получаю, это файл .so с плохой магией ELF. Любая помощь? - person Gaurav Deochakke; 10.03.2016