問題

示例:我有兩個共享物件(同樣應該適用於.dlls).第一個共享物件來自第三方庫,我們將稱之為libA.so.我用JNI包裝了其中一些並建立了我自己的庫libB.so.現在libB依賴於libA.

當webstart時,兩個庫都是某個webstart工作區的位置.我的java程式碼嘗試載入libB.此時,系統載入器將嘗試載入不在系統庫路徑中的libA(java.library.path不會幫助這個).最終結果是libB有一個不滿意的連結,無法使用.

我已經嘗試在libB之前載入libA,但這仍然不起作用.似乎作業系統想為我做這個載入.除了靜態編譯之外,有沒有辦法讓這個工作?

  最佳答案

我不確定這是否與webstart的方式完全相同,但是在處理一組本機庫時,我們在桌面應用程式中遇到了這種情況(在我們的情況下是dlls).

在libB之前載入libA應該工作,除非其中一個庫有一個依賴關係,而不是在路徑中.我的理解是,一旦它進入系統loadLibrary呼叫(即Java在其java.library.path中找到了庫,現在正在告訴作業系統載入它) – 它完全依賴於作業系統來找到任何依賴的庫,因為當時它是載入庫程序的作業系統,作業系統只知道如何檢視系統路徑.在Webastart的情況下,這似乎很難設定,但有辦法解決這不涉及靜態應用程式的問題.您可能不確定您的庫在哪裡洗牌 – 我不確定您的庫.

如果您使用自定義類載入器,您可以覆蓋loadLibrary和findLibrary,以便它可以從類路徑中的jar中找到您的庫,如果您還讓它知道您的本機庫依賴項(即libB依賴於libA,然後在載入libB時,您可以捕獲自己並確保首先載入libA,並首先檢查該通知並載入libX.然後作業系統不會嘗試找到不在路徑中的庫.它是klunky和一點痛苦,但確保Java找到並按正確的順序載入它們.

  相同標籤的其他問題

javajava-native-interfacejava-web-start
上一個問題: