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é ?

InformationsquelleAutor anselm | 2010-06-11