2

我无法弄清楚为什么会发生以下情况:

我正在从一个小型 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 和移动到 /data/felix 与adb push

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

4

1 回答 1

2

你构建框架的方式对我来说看起来不错。你可以考虑

  • FRAMEWORK_SYSTEMPACKAGES如果您的捆绑包将使用活动,则将其替换为特定于 Android 的列表),或
  • 不使用临时文件,而是指向您知道存在的某个目录。

我们过去成功使用过 3.0.1,我确实认为您发布的错误消息与它有关。您可以尝试使用该版本的 Felix,如果可行,您可能在 Felix 中发现了回归问题,然后您可以将其报告给 users@felix.apache.org。

于 2011-05-19T08:06:10.637 回答