2010-06-11 34 views
30

我不知道是否和如何可以在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 ...

所以我想知道如果任何人都可以開導我,如果這是可能的 其他一些方式或不應該是可能的。如果不可能, 任何人都可以提供爲什麼這是不可能的原因嗎?

+1

你有'DexFile d',然後永遠不會分配或使用它。 AFAIK,'DexClassLoader'是正確的方法,儘管我沒有親自使用它。 – CommonsWare 2010-06-11 12:51:25

+0

的確如此,DexFile是我試過的另一個骯髒的黑客的剩餘部分,我現在將研究DexClassLoader。 – anselm 2010-06-11 13:24:34

+0

我試過使用DexClassLoader,但這也不起作用。我創建了一個派生類並稱爲超級構造函數,其中包含超級構造函數(「/ sdcard/f.jar」,「/ sdcard」,null,getSystemClassLoader()); 但沒有成功。 Wether defineClass和findClass都返回任何動態連接的類。 我的懷疑是android根本不支持這個,否則正常的defineClass應該已經工作了。可能是因爲一些安全問題。但我肯定喜歡聽到原因,我也開始了一個關於android開發人員Google小組的討論。 – anselm 2010-06-11 13:56:06

回答

47

Dalvik測試套件中有DexClassLoader的example。它訪問的類加載器的反射性,但如果你正在構建針對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工具創建這樣一個罐子。

+2

將「/ tmp」替換爲設備上的其他內容。 – fadden 2010-06-11 23:32:31

+0

謝謝,我現在可以證實這個作品,太棒了! – anselm 2010-06-14 12:26:22

+2

dx.bat --dex --output = E:\ classes.dex E:\ test_app.jar – diyism 2012-03-21 09:24:29