我不知道是否和如何可以在Dalvik的動態加載DEX或類文件 ,一些quick'n'dirty測試功能我寫的是這樣的:如何在android/dalvik上動態加載Java類?
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();
}
}
而富的接口是這樣的
public interface Foo {
int get42();
}
和f.dex包含一些dx'ed實現該接口的:
public class FooImpl implements Foo {
public int get42() {
return 42;
}
}
以上測試驅動程序會引發在defineCl驢(),它不 工作,我調查了Dalvik的代碼,發現這一點:
http://www.google.com/codesearch/p?hl=en#atE6BTe41-M/vm/Jni.c&q=Jni.c ...
所以我想知道如果任何人都可以開導我,如果這是可能的 其他一些方式或不應該是可能的。如果不可能, 任何人都可以提供爲什麼這是不可能的原因嗎?
你有'DexFile d',然後永遠不會分配或使用它。 AFAIK,'DexClassLoader'是正確的方法,儘管我沒有親自使用它。 – CommonsWare 2010-06-11 12:51:25
的確如此,DexFile是我試過的另一個骯髒的黑客的剩餘部分,我現在將研究DexClassLoader。 – anselm 2010-06-11 13:24:34
我試過使用DexClassLoader,但這也不起作用。我創建了一個派生類並稱爲超級構造函數,其中包含超級構造函數(「/ sdcard/f.jar」,「/ sdcard」,null,getSystemClassLoader()); 但沒有成功。 Wether defineClass和findClass都返回任何動態連接的類。 我的懷疑是android根本不支持這個,否則正常的defineClass應該已經工作了。可能是因爲一些安全問題。但我肯定喜歡聽到原因,我也開始了一個關於android開發人員Google小組的討論。 – anselm 2010-06-11 13:56:06