¿Cómo cargar una clase Java dinámicamente en android / dalvik?

Me pregunto si y cómo se pueden cargar dex o archivos de clase dinámicamente en dalvik, alguna función de prueba rápida que escribí fue esta:

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(); } } 

mientras que la interfaz de Foo es esto

  public interface Foo { int get42(); } 

y f.dex contiene alguna implementación dx’ed de esa interfaz:

  public class FooImpl implements Foo { public int get42() { return 42; } } 

El controlador de prueba anterior arroja defineClass () y no funciona, e investigué el código dalvik y encontré esto:

http://www.google.com/codesearch/p?hl=en#atE6BTe41-M/vm/Jni.c&q=Jni.c …

Entonces me pregunto si alguien me puede aclarar si esto es posible de alguna otra manera o no se supone que sea posible. Si no es posible, ¿alguien puede explicar por qué esto no es posible?

Hay un ejemplo de DexClassLoader en el conjunto de pruebas Dalvik. Accede al cargador de clases de forma reflexiva, pero si comstack con el SDK de Android, puede hacer esto:

 String jarFile = "path/to/jarfile.jar"; DexClassLoader classLoader = new DexClassLoader( jarFile, "/tmp", null, getClass().getClassLoader()); Class myClass = classLoader.loadClass("MyClass"); 

Para que esto funcione, el archivo jar debe contener una entrada llamada classes.dex . Puede crear un contenedor de este tipo con la herramienta dx que viene con su SDK.