1

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

系统包 (0)

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

捆绑清单版本 = 2

捆绑名称 = 系统捆绑

Bundle-SymbolicName = org.apache.felix.framework

捆绑版本 = 4.1.0.SNAPSHOT

导出包 = org.osgi.framework; 版本=“1.6.0”,org.osgi.framework.launch;版本="1.0.0", org.osgi.framework.wiring; 版本="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; 版本=“1.1.0”,org.osgi.service.url;版本=“1.0.0”,org.osgi.util.tracker;版本="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 包。

4

1 回答 1

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();
于 2012-06-08T12:26:38.457 回答