Встроенный Феликс, работающий внутри Android-приложения, не может решить org.osgi.framework - PullRequest
2 голосов
/ 18 мая 2011

Я не могу понять, почему происходит следующее:

Я запускаю встроенный Apache Felix из небольшого приложения для Android.Я программно устанавливаю 2 пакета после запуска фреймворка, но оба никогда не переходят в «разрешенное» состояние.Таким образом, пакет «MyBundle1» импортирует «MyBundle2».

Это то, что Logcat говорит мне:

05-17 20:21:56.514: ERROR/MainActivity(384): org.osgi.framework.BundleException:    
Unresolved constraint in bundle de.xy.MyBundle1 [1]: Unable to resolve 1.11: missing   
requirement [1.11] package; (package=de.xy.MyBundle2) [caused by: Unable to resolve 2.0: 
missing requirement [2.0] package; (&(package=org.osgi.framework)(version>=1.5.0))]     

Я полностью понимаю, что говорится в сообщении об ошибке (хорошо ... org.osgi.framework в версии 1.5+ не может быть разрешено), ноя не могу понять, почему это происходит.Почему рамки не могут решить "сам" ?!Я попытался запустить тот же файл felix.jar, что и автономно с оболочкой adb, и оба пакета работают.Конечно, felix.jar обновлен (3.2)

Спасибо за ваш совет!

Даниэль

FelixSetup

    m_configMap = new StringMap(false);
    try {
        m_cache = File.createTempFile("felix-cache", null);
    } catch (IOException ex) {
        throw new IllegalStateException(ex);
    }
    m_cache.delete();
    boolean mkdirs = m_cache.mkdirs();  // works (=true)
    m_activator = new HostActivator();  // implements BundleActivator 
    List list = new ArrayList();
    list.add(m_activator);
    m_configMap.put(FelixConstants.LOG_LEVEL_PROP, "1");
    m_configMap.put(BundleCache.CACHE_ROOTDIR_PROP, ".");
    m_configMap.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);
    m_configMap.put(FelixConstants.FRAMEWORK_STORAGE, m_cache.getAbsolutePath()); 
    m_felix = new Felix(m_configMap);
    try {
        m_felix.start();
    } catch (BundleException ex) {
        Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
    }

Я не знаюесли это как-то связано с предыдущими проблемами:

05-18 08:52:59.149: VERBOSE/out(363): Problem creating boot delegation class loader:      java.lang.reflect.InvocationTargetException
05-18 08:52:59.209: VERBOSE/out(363): ERROR: Error parsing system bundle export statement:  (java.lang.IllegalArgumentException:A header cannot be an empty string.)

05-18 08:52:59.209: VERBOSE/out(363): java.lang.IllegalArgumentException: A header cannot be an empty string.

Я устанавливаю и запускаю комплекты с

myBundle1= bundleContext.installBundle("file:/data/felix/MyBundle1.jar"); 
myBundle2= bundleContext.installBundle("file:/data/felix/MyBundle2.jar"); 

myBundle1.start();

, они были ранее dx'едированы и перемещены в / data / felix с adb push .

Тот же код, который я использовал в Android-приложении, также работает в обычном консольном Java-приложении.

1 Ответ

2 голосов
/ 19 мая 2011

То, как вы строите фреймворк, выглядит хорошо для меня. Вы могли бы рассмотреть

  • заменив FRAMEWORK_SYSTEMPACKAGES списком, характерным для Android, если ваши пакеты будут, например, использовать деятельность), или
  • не использует временный файл, но указывает на какой-то каталог, который, как вы знаете, существует.

В прошлом мы успешно использовали 3.0.1, и у меня есть идея, что опубликованное вами сообщение об ошибке как-то связано с этим. Вы можете попробовать эту версию Felix, и если она сработает, возможно, вы обнаружили регрессию в Felix, о которой вы можете сообщить по адресу users@felix.apache.org.

...