猿问

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

我想知道是否以及如何在dalvik中动态加载dex或class文件,我编写的一些快速的“肮脏”测试函数是这样的:


    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实现:


    public class FooImpl implements Foo { 

            public int get42() { 

                    return 42; 

            } 

    } 

上面的测试驱动程序抛出了defineClass(),它不起作用,我研究了dalvik代码并发现了这一点:


http://www.google.com/codesearch/p?hl=zh_CN#atE6BTe41-M/vm/Jni.c&q=Jni.c ...


所以我想知道是否有人可以启发我,这是否可以通过其他方式实现或不应该实现。如果不可能,那么谁能提供无法实现的理由?


牛魔王的故事
浏览 351回答 3
3回答

GCT1015

Dalvik测试套件中有一个DexClassLoader 示例。它以反射方式访问类加载器,但是如果您要针对Android SDK进行构建,则可以执行以下操作:String jarFile = "path/to/jarfile.jar";DexClassLoader classLoader = new DexClassLoader(&nbsp; &nbsp; jarFile, "/tmp", null, getClass().getClassLoader());Class<?> myClass = classLoader.loadClass("MyClass");为此,jar文件应包含名为的条目classes.dex。您可以dx使用SDK附带的工具来创建这样的jar 。

鸿蒙传说

我尝试使用DexClassLoader,但这也不起作用。我创建了一个派生类,并使用super(“ / sdcard / f.jar”,“ / sdcard”,null,getSystemClassLoader())称为超构造函数;但是没有成功。defineClass和findClass都不会返回动态附加的任何类。我的怀疑是android根本不支持此功能,否则正常的defineClass应该已经可以工作了。可能是由于某些安全问题。但我一定想听听原因,我也在android-developers Google组上启动了一个线程。

慕姐4208626

DexClassLoader可以正常工作,如源树中的dalvik / tests / 068-classloader所示。需要“插件”体系结构的应用程序使用它。请记住,只有通过自定义类加载器才能看到该类。
随时随地看视频慕课网APP

相关分类

Java
Android
我要回答