Pregunta

Quiero cargar la biblioteca JNI de terceros en tiempo de ejecución.
He tratado de cargar directamente desde la tarjeta sd. Es de esperar falló.
He intentado copiar la biblioteca de sdcard a / data / data / app / y luego
System.load(/data/data/app/libjni.so)
Funciona en HTC Hero, pero falla en el HTC Legend con Android 2.1. se produce un error durante la ejecución de código nativo y escritura para registrar seguimiento de la pila no informativa Cualquier otra forma de hacerlo? Esa es la mejor pieza de código, que funciona a 1,5 (HTC Hero), pero donot obras en 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");
¿Fue útil?

Solución

cargador dinámico de Android no puede cargar el código ejecutable del sistema de archivos de la tarjeta sd, porque está marcada como no ejecutable y no se puede asignar páginas de memoria de almacenamiento de ejecutables no ejecutable. (En teoría manualmente podría copiar el contenido en ejecutable anónima asignan páginas, pero eso es feo. Las versiones de aplicaciones de soporte de Android en SD montar un sistema de archivos ejecutables contenidos en un archivo en la tarjeta sd, pero un tercio de aplicaciones externo no se puede escribir los)

Pero lo que puede hacer es escribir una biblioteca a una ubicación de escritura en almacenamiento interno - no el directorio lib a la que no tiene acceso de escritura, pero otro encontró de Context.getDir ( ) o Context.getFilesDir () y luego cargarlo utilizando la ruta completa y nombre de archivo .so usando System.load () en lugar de System.loadLibrary ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top