| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Android > Приложение с плагинами |
| Автор: McBlob 23.11.2011, 21:10 |
| У кого есть опыт разработки приложений под Android с использованием плагинов? Делал по аналогии с этой статьёй http://voituk.kiev.ua/2008/01/14/java-plugins/ В итоге, при загрузке класса плагина, ругается на интерфейс общий для плагина и приложения. Выдаёт Class resolved by unexpected DEX. Притом на простой джаве пример работает прекрасно. Если загружать в паралельном ClassLoader`е или если не подключать к приложению общий интерфейс, то всё загружается, но проку от этого нету, ибо работать с классом плагина могу только через этот интерфейс. Вообщем я в растерянности, совсем не понимаю в чём проблема. |
| Автор: ivanovpv 24.11.2011, 08:10 |
| Проблема в том, что у Android'а несколько иная виртуальная машинка, не стандартный JVM, а свой т.н. Dalvik VM - а DEX это перекодировщик байткодов с JVM на Dalvik VM. Загрузчик классов Android'а не понимает формат под которым собран плагин. Рецепт простой: надо пересобрать классы плагина под Android |
| Автор: McBlob 24.11.2011, 09:47 | ||||||
| Восстановил пример и попробую описать проблему подробнее - с кодом. 1. Есть обычный Java проект в котором описан интерфейс плагина
Этот проект будет добавляться в BuildPath/Projects плагина и приложения. 2. Есть Android проект плагина в котором описан класс
3. И есть Android проект приложения, которое должно этот плагин загружать. У Activity в методе onCreate() вызывается метод loadPlugin()
Так вот при попытке загрузит класс test.plugins.PluginInfo вываливается ошибка I/dalvikvm(586): Failed resolving Ltest/plugins/PluginInfo; interface 14 'Ltest/plugins/IPluginInfo;' I/dalvikvm(586): Link of class 'Ltest/plugins/PluginInfo;' failed Если же из этой схемы исключить Jаva проект с интерфейсом, то класс плагина отлично загружается. При этом в других моих программах для Android я свободно подключаю Java проекты и всё отлично работает. |
| Автор: McBlob 24.11.2011, 20:33 |
| Rebuild не помогает. Если общую библиотеку с интерфейсом оформить как Android проект, в Project properties -> Android указать IsLibrary и подключать её (в Project properties -> Android) только к проекту плагина, то всё загружается нормально. Если же эту библиотеку подключать и к главному приложению, то вываливаются ошибки: W/dalvikvm(823): Class resolved by unexpected DEX: Ltest/plugins/PluginInfo;(0x40528098):0x19ce30 ref [Ltest/plugins/IPluginInfo;] Ltest/plugins/IPluginInfo;(0x40515540):0xec690 W/dalvikvm(823): (Ltest/plugins/PluginInfo; had used a different Ltest/plugins/IPluginInfo; during pre-verification) I/dalvikvm(823): Failed resolving Ltest/plugins/PluginInfo; interface 14 'Ltest/plugins/IPluginInfo;' E/AndroidRuntime(823): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation |
| Автор: antiothers 19.1.2012, 09:19 |
| че то както сложновато |
| Автор: ShellRaiser 27.1.2012, 01:01 |
| Вы немного не в ту сторону копали Для андроида уже предусмотрена такая вещь как http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html =) |
| Автор: McBlob 14.2.2012, 16:43 |
| Ну я так понимаю, что в данном примере проект собирается при помощи анта вне эклипса. Как в таком случае его дебажить? |