Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение с плагинами 
:(
    Опции темы
McBlob
Дата 23.11.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.11.2011

Репутация: нет
Всего: нет



У кого есть опыт разработки приложений под Android с использованием плагинов?

Делал по аналогии с этой статьёй Создание pluginable решений при помощи Java 
В итоге, при загрузке класса плагина, ругается на интерфейс общий для плагина и приложения. Выдаёт  Class resolved by unexpected DEX.
Притом на простой джаве пример работает прекрасно. Если загружать в паралельном ClassLoader`е или если не подключать к приложению общий интерфейс, то всё загружается, но проку от этого нету, ибо работать с классом плагина могу только через этот интерфейс.

Вообщем я в растерянности, совсем не понимаю в чём проблема. 
PM MAIL   Вверх
ivanovpv
Дата 24.11.2011, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Проблема в том, что у Android'а несколько иная виртуальная машинка, не стандартный JVM, а свой т.н. Dalvik VM - а DEX это перекодировщик байткодов с JVM на Dalvik VM. Загрузчик классов Android'а не понимает формат под которым собран плагин.

Рецепт простой: надо пересобрать классы плагина под Android


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
McBlob
Дата 24.11.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.11.2011

Репутация: нет
Всего: нет



Восстановил пример и попробую описать проблему подробнее - с кодом.

1. Есть обычный Java проект в котором описан интерфейс плагина

Код

package test.plugins;

public interface IPluginInfo {
    public String getPluginClassName();
}


Этот проект будет добавляться в BuildPath/Projects плагина и приложения.

2. Есть Android проект плагина в котором описан класс

Код

package test.plugins;

import test.plugins.IPluginInfo;

public class PluginInfo implements IPluginInfo {

    public String getPluginClassName() {
        return "test.plugin1.Plug1";
    }

}


3. И есть Android проект приложения, которое должно этот плагин загружать. У Activity в методе onCreate() вызывается метод loadPlugin()

Код

    private void loadPlugin() {
        List<ApplicationInfo> apps = this.getPackageManager().getInstalledApplications(0);

        for (ApplicationInfo ai : apps) {
            if (ai.sourceDir.contains("test.plugin1")) {
                PathClassLoader cl = new PathClassLoader(ai.sourceDir, this.getClassLoader());
                try {
                    Class<?> c = cl.loadClass("test.plugins.PluginInfo");
                    System.out.println("test.plugins.PluginInfo loaded");
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }


Так вот при попытке загрузит класс 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 проекты и всё отлично работает.
PM MAIL   Вверх
ivanovpv
Дата 24.11.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Цитата(McBlob @  24.11.2011,  10:47 Найти цитируемый пост)
Так вот при попытке загрузит класс 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

Такое ощущение что при связывании на лету Dalvik не распознает сигнатуру интерфейса. Возможно билдер подсовывает ему ту которая была сгенерирована для JVM. Rebuild не помогает?


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
McBlob
Дата 24.11.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.11.2011

Репутация: нет
Всего: нет



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


PM MAIL   Вверх
antiothers
Дата 19.1.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 19.1.2012

Репутация: нет
Всего: нет



че то както сложновато
PM MAIL ICQ   Вверх
ShellRaiser
Дата 27.1.2012, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


еще чуть и закоммичу
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 20.7.2007
Где: Белaрусь, Гродно

Репутация: нет
Всего: 1



Вы немного не в ту сторону копали smile

Для андроида уже предусмотрена такая вещь как Custom Class Loading in Dalvik

=)
PM MAIL ICQ Skype   Вверх
McBlob
Дата 14.2.2012, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.11.2011

Репутация: нет
Всего: нет



Ну я так понимаю, что в данном примере проект собирается при помощи анта вне эклипса. Как в таком случае его дебажить?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.