ans*_*elm 32 java android classloader dalvik
我想知道是否以及如何在dalvik中动态加载dex或类文件,我写的一些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();
}
}
Run Code Online (Sandbox Code Playgroud)
而Foo界面就是这样
public interface Foo {
int get42();
}
Run Code Online (Sandbox Code Playgroud)
和f.dex包含该接口的一些dx'ed实现:
public class FooImpl implements Foo {
public int get42() {
return 42;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的测试驱动程序抛出了defineClass()并且它不起作用,我调查了dalvik代码并发现了这个:
http://www.google.com/codesearch/p?hl=en#atE6BTe41-M/vm/Jni.c&q=Jni.c ...
所以我想知道是否有人可以启发我,如果这可能以其他方式或不应该是可能的.如果不可能,任何人都可以提供无法解释的原因吗?
Jes*_*son 51
在Dalvik测试套件中有一个DexClassLoader 的例子.它反过来访问类加载器,但如果您正在构建Android SDK,则可以执行以下操作:
String jarFile = "path/to/jarfile.jar";
DexClassLoader classLoader = new DexClassLoader(
jarFile, "/tmp", null, getClass().getClassLoader());
Class<?> myClass = classLoader.loadClass("MyClass");
Run Code Online (Sandbox Code Playgroud)
为此,jar文件应包含一个名为的条目classes.dex.您可以dx使用SDK附带的工具创建此类jar .
| 归档时间: |
|
| 查看次数: |
35264 次 |
| 最近记录: |