Вопрос

Я хочу загрузить стороннюю библиотеку JNI во время выполнения.
Я пытался загрузить прямо из SDCard. Ожидалось, что оказано неудачно.
Я пытался скопировать библиотеку с SDCard на / data / data / app / а затем
System.load(/data/data/app/libjni.so)
Он работает на HTC Hero, но не удается на HTC Legend с Android 2.1. Он не удается во время выполнения нативного кода и писать, чтобы войти в систему Uninformative Stack Trace любой другой способ сделать это? Это лучший кусок кода, который работает на уровне 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 не может загрузить исполняемый код из файловой системы SDCard, поскольку она отмечена неидачком, и вы не можете отображать исполняемые страницы памяти из неисполняемого хранилища. (Теоретически вы могли бы вручную скопировать содержимое в исполняемые анонимные сопоставленные страницы, но это уродливо. Версии Android поддерживающих приложения на SD, установите файловые файловые файловые, содержащиеся в файле на SDCard, но приложение третьего лица не может написать их)

Но что вы можете сделать, это написать библиотеку в пищевое место в внутренний Хранение - не каталог lib, на котором у вас нет доступа к записи, но другой, который найден из context.getdir () или context.getfilesdir (), а затем загрузить его с помощью полного пути и имени файла .so с использованием System.Load ( ) вместо System.LoadLibrary ().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top