Question

Je veux charger la bibliothèque JNI tiers dans l'exécution.
J'ai essayé de charger directement à partir sdcard. Il expectedly a échoué.
J'ai essayé de copier la bibliothèque de sdcard / data / data / app / et
System.load(/data/data/app/libjni.so)
Il fonctionne sur HTC HERO, mais échoue sur HTC Legend avec Android 2.1. elle échoue pendant l'exécution du code natif et écrire à connecter trace de pile uninformative Toute autre façon de le faire? Cest le meilleur morceau de code, qui fonctionne à 1.5 (HTC Hero), mais donot fonctionne sur 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");
Était-ce utile?

La solution

Le chargeur dynamique Android ne peut pas charger le code exécutable à partir du système de fichiers de carte SD, car il est marqué non exécutable et vous ne pouvez pas mapper les pages de mémoire exécutables de stockage non exécutable. (En théorie, vous pouvez copier manuellement le contenu dans des pages mises en correspondance anonyme exécutable, mais c'est laid. Les versions d'applications de support Android sur SD monter un système de fichiers exécutables contenus dans un fichier sur la carte SD, mais une application tierce partie ne peut pas écrire les)

Mais ce que vous pouvez faire est d'écrire une bibliothèque à un emplacement inscriptible dans interne Stockage - le répertoire lib auquel vous ne disposez pas d'un accès en écriture, mais un autre résultat Context.getDir ( ) ou Context.getFilesDir (), puis le charger en utilisant le chemin complet et .donc nom de fichier en utilisant System.load () au lieu de System.loadLibrary ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top