从Android应用访问OSGI捆绑包

时间:2015-03-03 11:26:46

标签: android osgi apache-felix osgi-bundle

我正在运行嵌入在我的Android应用中的OSGI(Apache Felix)。此外,我能够安装,注册和启动服务提供和服务消费包。服务使用捆绑包按照预期使用服务提供捆绑包提供的服务。 现在我希望我的应用程序与bundle通信,即为bundle提供方法参数或从那里接收处理结果。

不幸的是,当我尝试直接从我的应用访问捆绑包时,由于涉及不同的类加载器或ClassCastException,我会收到相同类型的NoClassDefFoundException个。

START更新

我的应用程序的核心是一个工作服务w,它启动另一项服务,负责管理OSGI事务。要在f中运行的bundle只能作为* .jar文件使用,所有这些文件都导出自己的接口。从w内部我可以通过

获取ServiceTracker对象来跟踪实现bundle接口的对象的实例。

ServiceTracker serviceTracker = new ServiceTracker(context,"my.bundle.BundleInterface", null);

我现在可以通过提取实际的服务对象了 来自任何捆绑包外部的Object serviceObject = serviceTracker.getService();仅在w。

的代码内

现在调用BundleInterface interfaceObject = (BundleInterface) serviceObject;会产生NoClassDefFoundException

我已经将bundle的jar文件添加到构建路径中,以便编译代码。

如何访问我的serviceObject? 我想这是一个类加载的问题,但我如何确保该类由相同的类加载器加载?我是否必须在felix配置属性文件中添加任何条目?

END更新

1 个答案:

答案 0 :(得分:0)

很难回答你的问题。我会很高兴有更多细节;-)在哪些情况下,例外情况会发生吗?你能给我一些片段来看看吗?

我想ClassCastException可能来自于一个类由两个不同的类加载器加载的事实。服务使用者和提供者都需要从同一个包中共享该类。如果这是服务接口,一个好的做法是在包含捆绑API的共享包中定义它(所有服务接口,......)

在某些情况下,服务实现不能事先知道他们将使用的类(例如,ORM事先不知道模型类)。在这种情况下,TCCL(线程上下文类加载器)可能非常有用。

希望它可以帮到你, 亨利