Как загрузить класс Java динамично на андроиде/Дальвике?

Я задаюсь вопросом, если и как можно загрузить 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 (), и он не работает, и я исследовал код Дальвика и нашел это:

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

Таким образом, я задаюсь вопросом, может ли кто-либо просветить меня, если это возможно некоторым другим способом или не предполагаемое быть возможным. Если это не возможно, кто-либо может обеспечить причины, почему это не возможно?

32
задан anselm 11 June 2010 в 11:53
поделиться

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-файл должен содержать запись с именем classes.dex. Вы можете создать такой jar с помощью инструмента dx, который поставляется с вашим SDK.

51
ответ дан 27 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: