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

2022-09-01 08:48:27

我想知道是否以及如何在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(); 
            } 
    } 

而 Foo 接口是这样的

    public interface Foo { 
            int get42(); 
    } 

和 f.dex 包含该接口的一些 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...

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


答案 1

在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 文件应包含一个名为 的条目。您可以使用 SDK 附带的工具创建这样的 jar。classes.dexdx


答案 2

推荐