Я задаюсь вопросом, если и как можно загрузить 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...
Таким образом, я задаюсь вопросом, может ли кто-либо просветить меня, если это возможно некоторым другим способом или не предполагаемое быть возможным. Если это не возможно, кто-либо может обеспечить причины, почему это не возможно?
В наборе тестов 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.