如何在android / dalvik上dynamic加载Java类?

我想知道是否和如何可以在dalvik中dynamic加载dex或class文件,我写的一些quick'n'dirtytesting函数是这样的:

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

而Foo接口是这样的

  public interface Foo { int get42(); } 

和f.dex包含了一些dx的实现该接口:

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

上面的testing驱动程序抛出defineClass(),它不工作,我调查了达尔维克代码,发现这一点:

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

所以我想知道是否有人可以启发我,如果这是可能的其他方式或不应该是可能的。 如果这是不可能的,任何人都可以提供为什么这是不可能的原因?

在Dalviktesting套件中有一个DexClassLoader的例子 。 它reflection地访问类加载器,但是如果您正在构buildAndroid SDK,则可以这样做:

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

为了这个工作,jar文件应该包含一个名为classes.dex的条目。 您可以使用SDK附带的dx工具创build这样一个jar文件。