Comment charger une classe Java de façon dynamique sur android/dalvik?
Je me demande si et comment on peut charger de dex ou les fichiers de classe dynamiquement
dans dalvik, certains rapide n'dirty fonction de test que j'ai écrit était-ce:
public void testLoader() {
InputStream in;
int len;
byte[] data = new byte[2048];
try {
in = context.getAssets().open("f.dex");
len = in.read(data);
in.close();
DexFile d;
Class c = defineClass("net.webvm.FooImpl", data, 0, len);
Foo foo = (Foo)c.newInstance();
} catch (IOException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
alors que les Foo interface est-ce
public interface Foo {
int get42();
}
et f.dex contient certains dx ed de mise en œuvre de cette interface:
public class FooImpl implements Foo {
public int get42() {
return 42;
}
}
Le test ci-dessus, le pilote jette à defineClass() et il n'a pas
le travail et j'ai étudié le code dalvik et trouvé ceci:
http://www.google.com/codesearch/p?hl=en#atE6BTe41-M/vm/Jni.c&q=Jni.c...
Donc je me demandais si quelqu'un peut m'éclairer si c'est possible
une autre façon, ou ne devrait pas être possible. Si il n'est pas possible,
quelqu'un peut-il expliquer pourquoi ce n'est pas possible?
- Vous avez
DexFile d
, de ne jamais céder ou de les utiliser. Autant que je sache,DexClassLoader
est la bonne approche, même si je ne l'ai pas utilisé personnellement. - C'est vrai, la DexFile est quelque reste de l'autre sale hack j'ai essayé, je vais regarder dans DexClassLoader maintenant.
- J'ai essayé d'utiliser DexClassLoader, mais cela ne fonctionne pas non plus. J'ai créé une classe dérivée et a appelé le superconstructor avec super("/sdcard/f.jar", "/sdcard", null, getSystemClassLoader()); Mais sans succès. Si defineClass ni findClass retour toute la classe qui est attaché de façon dynamique. Mon suspect est que android ne prend pas en charge ce, à tous, sinon normal defineClass devraient travailler déjà. Probablement à cause de certains problèmes de sécurité. Mais j'aurais vraiment aimer entendre les raisons, j'ai aussi commencé un fil sur android, les développeurs de Google groupe.
- DexClassLoader œuvres, comme illustré par dalvik/tests/068-chargeur de classe dans l'arbre source. Elle est utilisée par des applications qui veulent un "plugin" de l'architecture. Gardez à l'esprit que la classe n'est visible qu'en passant par la coutume de la classe loader.
- Peut-être PathClassLoader est mieux: stackoverflow.com/questions/2903260/...
- Regardez: stackoverflow.com/questions/5104823/...
- Pourriez-vous s'il vous plait remplacez google.com/codesearch/p?hl=en#atE6BTe41-M/vm/Jni.c&q=Jni.c comme il est cassé ?
Vous devez vous connecter pour publier un commentaire.
Il y a un exemple de DexClassLoader dans le Dalvik suite de tests. Il accède à la classloader reflectively, mais si vous êtes la construction de contre le SDK Android, tu peux faire ça:
Pour que cela fonctionne, le fichier jar doit contenir une entrée nommée
classes.dex
. Vous pouvez créer un pot avec ledx
outil est fourni avec le kit de développement logiciel.build.xml
réglages de android-developers.blogspot.com/2011/07/... - mais est-il un moyen d'avoir de l'Éclipse ne le dx étape sur chaque génération?