2015-03-03 109 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