在一個Java項目中,我使用的是通過如何通過Java代碼影響System.loadLibrary()的搜索路徑?
System.loadLibrary("libName");
加載一些機庫的第三方庫,我想能夠從我的應用程序中的影響這種方法的搜索路徑,從而使用戶不需要在命令行上指定正確的java.library.path值(該值取決於當前的操作系統和體系結構)。例如,在Windows上我想將它設置爲 「LIB /本地/窗口」,在Linux上的32位爲 「LIB /本地/ linux32鏡像」 等
我試圖
System.setProperty("java.library.path", ...)
但這被忽略,這顯然是因爲在我的代碼運行之前,JVM只讀取一次該屬性。
我也試圖與
System.load("fullPath/lib")
此調用成功使用依賴於它的Java庫前加載本地libray,但仍然會有一個UnsatisfiedLinkError當本機庫與系統再次加載。調用LoadLibrary()。
我發現的唯一方法如下:
- 添加接口抽象外部庫的整個API。
- 在代碼的其餘部分只使用這些接口。
- 添加實現接口並委託給庫的類。
- 寫一個自己的ClassLoader,那
- 覆蓋findLibary(),使本機庫是在正確的路徑
- 覆蓋的loadClass(發現),並通過自身加載外部庫的所有類和包裝層,而不是試圖委託給它的父類的默認的ClassLoader會做
- 確保接口加載與正常類加載器和包裝類和外部庫裝載有我自己的ClassLoader。
這可行,但我覺得它非常複雜,它很費力,因爲我需要添加所有這些接口。有一種更簡單的方法嗎?
做過或沒做過System.load(「fullPath/lib/native/windows/libName.dll」)?爲什麼你用`System.loadLibrary(..)`重新加載它? – dacwe 2011-02-16 07:44:20
@dacwe是的,它確實有效。但是第三方庫嘗試使用System.loadLibrary(..)重新加載它,並且失敗。 – 2011-02-16 08:00:52