Как динамически загружать Java-класс на android / dalvik?

Мне интересно, как и как можно динамически загружать файлы dex или class в dalvik, некоторая функция quick'n'dirty test, которую я написал, такова:

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 содержит некоторую реализацию этого интерфейса:

  public class FooImpl implements Foo { public int get42() { return 42; } } 

Вышеуказанный тестовый драйвер бросает в defineClass (), и он не работает, и я исследовал код dalvik и нашел это:

Http://www.google.com/codesearch/p?hl=ru#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 . Вы можете создать такую ​​банку с помощью инструмента dx , который поставляется с вашим SDK.