2015-03-03 111 views
0

我正在OSGI(Apache Felix)中嵌入我的Android应用程序。此外,我可以安装,注册并启动服务提供和服务消费包。服务使用包按预期消耗服务提供包提供的服务。 现在我想让我的应用程序与捆绑软件进行通信,即向捆绑软件提供方法参数或从那里接收处理结果。从Android应用程序访问OSGI包

不幸的是,当试图直接从我的应用程序访问捆绑软件时,由于涉及到不同的类加载器或NoClassDefFoundException,我要么收到ClassCastException s的相同类型。

开始更新

中央对我的应用程序是W的启动另一个服务˚F全权负责管理OSGI事项工作者服务。要在f中运行的软件包仅作为* .jar文件提供,所有这些文件都将导出自己的界面。从内部我可以通过

ServiceTracker serviceTracker = new ServiceTracker(context,"my.bundle.BundleInterface", null);跟踪实施捆绑接口的对象实例的ServiceTracker对象。

我现在可以通过 Object serviceObject = serviceTracker.getService();从任何包的外部提取实际的服务对象,只是在w的代码中。

现在呼叫BundleInterface interfaceObject = (BundleInterface) serviceObject;产生NoClassDefFoundException

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

我该如何访问我的serviceObject? 我想这是一个类加载的问题,但我如何确保类是由相同的类加载器加载?我是否需要将任何条目添加到felix config属性文件中?

END更新

回答

0

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

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

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

希望它可以帮助你, 蒂埃里您的回复

+0

谢谢 - 你是正确的 - 似乎是一个类加载器的问题,但虽然我敢肯定,我基本上明白是什么问题,我很遗憾不能确定什么样的实际的解决方案看起来像。 – 2015-03-11 16:34:29