我开发了一个小型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包。
答案 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();