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

标签 java android classloader dalvik

我想知道是否以及如何动态加载 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/

相关文章:

java - 查找原始二维排序数组索引

java - 当我尝试从 Firestore 获取数据并显示在 ListView fragment 中时,我的应用程序崩溃了

android - 自定义 EditText 的错误状态

android - 使用离线 Google map 创建导航

java - JBOSS 6.0如何解决ear文件之间的类加载问题?

java - 如何处理大量动画 vector 绘图?

java - Spring MVC - 从 web.xml 注入(inject)上下文参数

android - android软键盘可以启动其他IME吗

javafx - 如何从 JavaFX Media 包中加载文件?

java - Java 如何反序列化 Class 对象,同时保留它们对当前加载的 Class 对象的标识?