OSGi(Felix):更改系统包的标准包,使其在Android上运行

时间:2012-06-08 11:08:24

标签: android osgi bundle packages apache-felix

我开发了一个小型EMF项目作为OSGi Bundle。现在我想在Apache Felix的android上使用它。 EMF使用一些标准的Java库。像java.xml.xxx。通常,OSGi系统捆绑包会导出这些。但在我的android案例中它看起来像这样:

  

系统包(0)

     

Bundle-Description =此捆绑包是系统特定的;它实现了各种系统服务。

     

Bundle-ManifestVersion = 2

     

Bundle-Name =系统包

     

Bundle-SymbolicName = org.apache.felix.framework

     

Bundle-Version = 4.1.0.SNAPSHOT

     

Export-Package = org.osgi.framework;版本= “1.6.0”,   org.osgi.framework.launch; version =“1.0.0”,org.osgi.framework.wiring;   version =“1.0.0”,org.osgi.framework.startlevel;版本= “1.0.0”,   org.osgi.framework.hooks.bundle;版本= “1.0.0”,   org.osgi.framework.hooks.resolver;版本= “1.0.0”,   org.osgi.framework.hooks.service;版本= “1.1.0”,   org.osgi.framework.hooks.weaving;版本= “1.0.0”,   org.osgi.service.packageadmin;版本= “1.2.0”,   org.osgi.service.startlevel; version =“1.1.0”,org.osgi.service.url;   version =“1.0.0”,org.osgi.util.tracker;版本= “1.5.0”

     

Export-Service =   org.osgi.service.packageadmin.PackageAdmin,org.osgi.service.startlevel.StartLevel,org.osgi.service.url.URLHandlers

     

提供能力=

这与普通系统捆绑包的系统捆绑导出形成鲜明对比;-) 我不知道它是否扮演一个角色:我这样开始Felix:

        Properties configArg = new Properties();
        File chacheDir = this.getFilesDir();
        configArg.setProperty(Constants.FRAMEWORK_STORAGE, chacheDir.getAbsolutePath());
        configArg.setProperty("osgi.shell.telnet.ip", ipadd);
        configArg.setProperty("osgi.shell.telnet.port", "6666");
        Felix felix = new Felix(configArg);

        try{
            felix.start();
            ...

现在的问题是,如何在系统包中获取缺少的标准java包。

1 个答案:

答案 0 :(得分:3)

我找到的最佳解决方案是将FRAMEWORK_SYSTEMPACKAGES替换为Android平台中提供的特定软件包。这些是,

  • 您在android.jar中找到的所有目标设备
  • java.*junit.*
  • 除外
  • 但是系统捆绑的所有org.osgi.*个包都会正常导出。

所以,像

String SYSTEM_PACKAGES = 
    "org.osgi.framework;version=\"1.6\"," + 
    // ...
    "android," + 
    // ...
    "javax.crypto," + 
    // ...
    "org.apache.commons.logging";

Map<String, Object> config = new HashMap<String, Object>();
config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, SYSTEM_PACKAGES);
Framework framework = new Felix(config);
framework.start();