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

OSGi(Felix):更改系统包的标准包,使其在Android上运行,android,osgi,bundle,packages,apache-felix,Android,Osgi,Bundle,Packages,Apache Felix,我开发了一个小型EMF项目作为OSGi包。现在我想在android和ApacheFelix上使用它。EMF使用一些标准java库。比如java.xml.xxx。通常,OSGi系统包会导出这些。但在我的安卓系统中,它看起来是这样的: Properties configArg = new Properties(); File chacheDir = this.getFilesDir(); configArg.setProperty(Constants.

我开发了一个小型EMF项目作为OSGi包。现在我想在android和ApacheFelix上使用它。EMF使用一些标准java库。比如java.xml.xxx。通常,OSGi系统包会导出这些。但在我的安卓系统中,它看起来是这样的:

        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();
            ...
系统包(0) Bundle Description=此Bundle是特定于系统的;它实现了各种系统服务

捆绑包版本=2

Bundle Name=系统包

Bundle SymbolicName=org.apache.felix.framework

捆绑包版本=4.1.0.0

导出包=org.osgi.framework;version=“1.6.0”, org.osgi.framework.launch;version=“1.0.0”,org.osgi.framework.willing; version=“1.0.0”,org.osgi.framework.startlevel;version=“1.0.0”, org.osgi.framework.hooks.bundle;version=“1.0.0”, org.osgi.framework.hooks.resolver;version=“1.0.0”, org.osgi.framework.hooks.service;version=“1.1.0”, org.osgi.framework.hooks.weaving;version=“1.0.0”, org.osgi.service.packageadmin;version=“1.2.0”, org.osgi.service.startlevel;version=“1.1.0”,org.osgi.service.url; version=“1.0.0”,org.osgi.util.tracker;version=“1.5.0”

出口服务= 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包。

我找到的最佳解决方案是用Android平台中提供的特定包替换
FRAMEWORK\u SYSTEMPACKAGES
。这些是,

  • 您在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();
字符串系统\u包=
“org.osgi.framework;版本=\“1.6\”,“+
// ...
“安卓,”+
// ...
“javax.crypto,”+
// ...
“org.apache.commons.logging”;
Map config=newhashmap();
config.put(Constants.FRAMEWORK\u SYSTEMPACKAGES,SYSTEM\u PACKAGES);
框架=新的Felix(配置);
framework.start();