2010-05-13 16 views
2

Je souhaite charger une bibliothèque jni tierce en phase d'exécution.
J'ai essayé de charger directement à partir de la carte SD. Il a échoué.
J'ai essayé de copier la bibliothèque de sdcard/data/data/app/puis
System.load(/data/data/app/libjni.so)
Il fonctionne sur HTC HERO, mais échoue sur HTC Legend avec Android 2.1. échoue lors de l'exécution du code natif et écrit pour consigner la trace de la pile non informative Toute autre façon de le faire? C'est le meilleur morceau de code, qui fonctionne à 1.5 (HTC Hero), mais ne fonctionne pas sur 2.1 (HTC Legend).Comment charger jni de la carte SD sur android 2.1?

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

Vous n'avez pas la possibilité de lire ou d'écrire un fichier '/ data/data/libjni.so' sur un périphérique de production. – CommonsWare

+0

Yup. Vous voudriez le copier dans le répertoire "lib" du répertoire d'installation de l'application. Du côté positif, le chargeur de classe de l'application le trouverait automatiquement, ainsi vous pourriez utiliser System.loadLibrary() au lieu de System.load(). – fadden

+0

Désolé pour les erreurs en question. Malheureusement, je n'ai aucun droit d'écrire dans/data/data/app/lib depuis mon application pendant l'exécution. J'ai essayé, mais j'ai obtenu une exception FileNotFoundException, quand j'ai essayé de créer un nouveau fichier. –

Répondre

1

chargeur dynamique de 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 mappées anonymes exécutables, mais c'est moche Les versions d'android supportant les applications sur SD montent un système de fichiers exécutable contenu dans un fichier sur la carte SD, mais une application tierce ne peut écrire) Mais vous pouvez écrire une bibliothèque dans un emplacement inscriptible dans interne stockage - pas le répertoire lib auquel vous n'avez pas d'accès en écriture, mais un autre trouvé dans Context.getDir() ou Context. getFilesDir(), puis chargez-le en utilisant le chemin d'accès complet et le nom de fichier .so en utilisant System.load() au lieu de System.loadLibrary().

+0

J'ai essayé ceci mais tout ce que je reçois est "le fichier .so a une mauvaise magie ELF". De l'aide? –