我想知道是否以及如何动态加载 dex 或 class 文件 在 dalvik 中,我写的一些 quick'n'dirty 测试函数是这样的:
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 接口(interface)是这个
public interface Foo {
int get42();
}
并且 f.dex 包含该接口(interface)的一些 dx'ed 实现:
public class FooImpl implements Foo {
public int get42() {
return 42;
}
}
上面的测试驱动程序在 defineClass() 处抛出,但它没有 工作,我调查了 dalvik 代码,发现了这个:
http://www.google.com/codesearch/p?hl=en#atE6BTe41-M/vm/Jni.c&q=Jni.c ...
所以我想知道是否有人可以启发我,如果这可能在 其他方式或不应该是可能的。如果不可能, 谁能提供这不可能的原因?
最佳答案
有一个 example Dalvik 测试套件中的 DexClassLoader。它以反射方式访问类加载器,但如果您是针对 Android 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
工具创建这样的 jar。
关于java - 如何在 android/dalvik 上动态加载 Java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3022454/