我不知道为什么会发生以下情况:

我正在从一个小型android应用程序运行嵌入式apache felix。在启动框架后,我以编程方式安装了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))]


我完全理解错误消息的内容(无法解决1.5+版中的org.osgi.framework),但是我不知道为什么会发生这种情况。为什么框架无法解决“他自己”?我尝试使用adb shell运行与独立运行相同的felix.jar,并且两个捆绑包都能工作。当然,felix.jar是最新的(3.2)

谢谢你的建议!

丹尼尔

Felix安装

    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'ed并通过adb push移动到/ data / felix。

我在android-application中使用的相同代码也可以在常规java console-app中使用。

最佳答案

建立框架的方式对我来说还可以。你可以考虑


如果您的捆绑包例如将FRAMEWORK_SYSTEMPACKAGES替换为Android专用的列表,正在使用活动),或
不是使用临时文件,而是指向您知道的某个目录。


过去,我们已经成功使用了3.0.1,我确实认为您发布的错误消息与此有关。您可以尝试使用该版本的Felix,如果可行,则可能已经在Felix中找到了回归,然后可以将其报告给[email protected]

关于android - 嵌入式Felix,在android-app内部运行无法解析org.osgi.framework,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6036920/

10-09 09:26