【问题标题】:Accessing OSGI bundles from Android app从 Android 应用程序访问 OSGI 包
【发布时间】:2015-05-04 00:52:33
【问题描述】:

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

不幸的是,当尝试直接从我的应用程序访问捆绑包时,由于涉及不同的类加载器,我要么收到同一类型的 ClassCastExceptions,要么收到 NoClassDefFoundException

开始更新

我的应用程序的核心是一个工作服务 w,它启动另一个服务 f,该服务专门负责管理 OSGI 事务。在 f 中运行的包只能作为 *.jar 文件使用,它们都导出自己的接口。从 w 内部,我可以获取一个 ServiceTracker 对象,该对象跟踪通过

实现捆绑接口的对象的实例

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

我现在可以通过 Object serviceObject = serviceTracker.getService(); 来自 w 代码内的任何捆绑包之外。

现在调用BundleInterface interfaceObject = (BundleInterface) serviceObject; 会得到NoClassDefFoundException

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

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

结束更新

【问题讨论】:

    标签: android osgi apache-felix osgi-bundle


    【解决方案1】:

    很难回答你的问题。我会很高兴有更多的细节 ;-) 在哪些情况下会发生异常?能给我一些sn-ps看看吗?

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

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

    希望对你有帮助 蒂埃里

    【讨论】:

    • 感谢您的回复-您是对的-似乎是类加载器问题,但是尽管我确定我基本上了解问题所在,但不幸的是,我不确定实际的解决方案是什么样的.
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多