2014-08-28 130 views
5

是否可以將兩個版本(64位和32位)的本機DLL放在java.library.path上?我可以將本地庫的32位和64位版本放在java.library.path上嗎?

我關心的是,如果我將64位和32位版本放在本機庫路徑上,那麼在運行不同的體系結構時會出現不滿意的鏈接異常。如果是這樣,那麼首選解決方案是什麼?在我的gradle/maven構建腳本中有一個標誌鏈接正確的庫?

目前我做的是以下幾點: -

-Djava.library.path=/out/lib/win64jdk;/out/lib/winx86jdk 

兩者都含有的架構相關的DLL。我目前還不確定JVM是否可以確定這些符號。

回答

2

如果我是你,我會確保只有適當的本地dll是在分發包並把另一個留下。

如果您想分配兩者,那麼您需要編寫一些Java代碼來加載正確的庫。 System.loadLibrary用於加載本機庫,並且正常的事情是在Java代碼中的靜態初始化程序中調用它。

除非你願意粗暴地依靠例外,您可以使用此代碼:

System.getProperty("sun.arch.data.model") 

加載適當的本地庫。該功能將相應地返回32或64。

+0

我目前無法更改java代碼,但我正在對構建腳本進行排序,因此我將使用Gradle來確定構建是否適用於64位/ 32位,直到我可以修改代碼以加載正確的代碼圖書館。 – chrisw 2014-08-28 09:20:37

1

您可以選擇不添加它們,然後在您需要它們之前(例如,當您的應用程序啓動時),根據當前系統體系結構加載正確的一個。

你可以用System.loadLibrary()加載:

boolean is64bit = ...; // See below how to detect 
System.loadLibrary("/out/lib/win" + (is64bit ? "64jdk" : "x86jdk")); 

檢測體系結構:

How can I tell if I'm running in 64-bit JVM or 32-bit JVM (from within a program)?

+0

我目前無法更改java代碼,但我正在對構建腳本進行排序,因此我將使用Gradle來確定構建是否爲64位/ 32位,直到我可以修改要加載的代碼正確的圖書館。 – chrisw 2014-08-28 09:21:03

相關問題