2008-08-07 67 views
13

示例:我有兩個共享對象(同樣應用於.dlls)。第一個共享對象來自第三方庫,我們將其稱爲libA.so.我用JNI包裝了一些,創建了我自己的庫libB.so.現在libB依賴於libA。我怎樣才能Java webstart多個依賴的本地庫?

webstarting時,這兩個庫是一些在webstart工作區域中的位置。我的java代碼試圖加載libB。此時系統加載器將嘗試加載不在系統庫路徑中的libA(java.library.path不會幫助這一點)。最終結果是libB有一個不滿意的鏈接,不能使用。

我已經試過裝力霸libB之前,但仍然無法正常工作。似乎操作系統想爲我加載。除靜態編譯外,是否有任何方法可以使此工作成爲可能?

回答

2

靜態編譯證明是Webstart的多個依賴本機庫的唯一途徑。因爲操作系統解決本地依賴條件

5

我不知道這是否會準確地處理了在webstart以同樣的方式,但有一組本地庫(在本例中的DLL)的問題時,我們遇到了這種情況在桌面應用程序。 libB前

加載力霸應該工作,除非這些庫中的一個具有依賴性是下落不明,而不是在路徑。我的理解是,一旦到達系統loadLibrary調用(即Java已在其java.library.path中找到該庫並且現在告訴OS加載它) - 它完全依賴於操作系統來查找任何相關庫,因爲那時操作系統正在爲該進程加載庫,而操作系統只知道如何查看系統路徑。這似乎很難在Webstart應用程序中設置,但有一種解決方法不涉及靜態編譯。您可能能夠在您的庫的位置上進行混洗 - 我不確定

如果您使用自定義類加載器,則可以覆蓋loadLibrary和findLibrary,以便它可以從類路徑中的jar中找到您的庫,並且如果您也讓它知道你的本地庫的依賴關係(即libB依賴於libA取決於libX,然後當加載libB時你可以捕捉自己,並確保你先加載libA,並檢查通知並首先加載libX,然後操作系統不嘗試找到一個圖書館,是不是在你的路徑,它是klunky,有點痛苦的,但要確保Java的發現他們並加載它們都在正確的順序可以工作。

+1

類加載器無法修復該問題。 – basszero 2009-01-26 01:46:17

0

被打包成一個簽署罐子兩個機庫這是列出的as

<nativelib ...> 

在JNLP文件中?