Frage

Ich möchte von Drittanbietern jni Bibliothek zur Laufzeit laden.
Ich habe versucht, direkt von der SD-Karte zu laden. Es expectedly gescheitert.
Ich habe versucht,
kopieren Bibliothek von sdcard / data / data / app / und dann System.load(/data/data/app/libjni.so)
Es funktioniert auf dem HTC Hero, aber nicht auf dem HTC Legend mit Android 2.1. es scheitert bei der Ausführung von nativen Code und Schreib uninformativ Stack-Trace anmelden Jede andere Art und Weise, es zu tun? Das ist das beste Stück Code, das funktioniert bei 1,5 (HTC Hero), aber donot Werke auf 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");
War es hilfreich?

Lösung

Androids Dynamic Loader ausführbaren Code aus dem sdcard Dateisystem nicht geladen werden kann, weil sie nicht ausführbar markiert ist und Sie können von nicht ausführbaren Speicher ausführbaren Speicherseiten nicht abbilden. (Theoretisch könnten Sie manuell kopieren die Inhalte in ausführbare anonymen kartiert Seiten, aber das ist hässlich. Android-Versionen unterstützen Anwendungen auf SD mounten eine ausführbare Dateisysteme innerhalb einer Datei auf der SD-Karte enthalten sind, sondern ein Dritter App diejenigen, die nicht schreiben können)

Aber was können Sie tun, ist eine Bibliothek zu einem beschreibbaren Speicherort schreiben in interne Lagerung - nicht das lib Verzeichnis, in dem Sie keinen Schreibzugriff haben, aber ein anderer von Context.getDir gefunden ( ) oder Context.getFilesDir () und es dann laden sie den vollständigen Pfad und Dateinamen .so () anstelle von System.loadLibrary () mit System.load verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top