Как динамически загружать 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.

Intereting Posts
DrawerLayout Double Drawer (левый и правый ящики одновременно) Большой размер приложения из-за изображений. Как сжимать изображения .PNG? Как получить уведомления о переносе андроида pushcordova, когда приложение находится в режиме ожидания или находится в фоновом режиме? Как заменить фрагмент на другой фрагмент в TabLayout и ViewPager Как реализовать материальный дизайн Хореографическая анимация поверхности Сохранить / Восстановить фрагменты состояния Android Создание подписанного APK: ошибки при создании APK Android Studio Программно отключить аппаратное ускорение холста в браузере Два Android-приложения с разными именами пакетов, используя одно приложение для Facebook Как контролировать перекрытие изображений галереи? Аннотации Android – Ввод списка типов суперкласса Не найден ресурс, который соответствует указанному имени (в 'cardBackgroundColor' со значением '? Android: attr / colorBackgroundFloating') Haskell Android OpenGL Как сделать копию файла в android? Wi-Fi-модем – как получить список подключенных клиентов