2011-03-27 64 views
3

可能重複:
Java : switching between dll depends on system architecture (32/64)加載32位或64位JNI庫中的Java

在我的Java應用程序,我需要一個JNI庫,可用於32位和64位。我不想發佈兩個不同版本的應用程序,所以我想用兩個庫發佈應用程序,應用程序必須確定自己要加載哪個庫(foobar32.so或foobar64.so)。我怎麼做?

我想加載第一個,如果這會拋出一個異常,然後我加載第二個,但這聽起來很難看。

是否有一些系統屬性,我可以檢查,而不是確定是否使用32位Java或64位Java來運行我的應用程序?我知道有一些os.arch屬性,但根據this answer,返回值似乎非常不可預測。

那麼讓應用程序決定是否加載32位或64位JNI庫的最佳方式是什麼?

+0

您是如何捆綁應用程序的?在OSGi中,您只能根據操作系統體系結構加載某些軟件包或打包碎片。這是如何交付平臺特定功能的。你可以考慮使用OSGi嗎? – katsharp 2011-03-27 12:04:18

+0

您的主要關注點不是操作系統是什麼,而是可執行文件是什麼:您可以在64位操作系統上運行32位可執行文件,但它仍然是32位,而您需要的庫是32位而不是64.如果假設您可以在某個32位上運行64位可執行文件操作系統,你需要64位庫。這是przemelek試圖解釋的。 「os.arch」對於任何事物來說都是足夠好的,只要它存在,我的回答就是針對不安全的情況,但某些系統屬性可能不存在。 – bestsss 2011-03-27 14:12:47

回答

5

爲什麼不可預測?你只想檢測它是否是32位系統,在這種情況下,它總是x86(當然對於x86處理器),其他的意味着64位。

如果您知道您的代碼也可能在PPC或其他非x86處理器上執行,則會出現問題。但在這種情況下,您可能會使用帶有異常驅動流控制的醜陋攻擊,並使用try {} catch()來「檢測」這種情況。

恕我直言os.arch將是最好的解決方案。

+0

@przemelek - 'os.arch'是不可靠的,因爲它返回用於編譯jar的系統屬性,而不是它運行的系統(參見我的回答鏈接) – MByD 2011-03-27 13:00:32

+1

@MByD:不,系統屬性' os.arch' ---所有的Java系統屬性---是一個運行時的概念,而不是編譯時的概念。因此,它返回運行時體系結構。 – jmg 2011-03-27 13:03:12

+0

@jmg。我犯了一個錯誤。 os.arch的返回值是運行時的值,但是它依賴於JRE的位數,而不是實際的體系結構,所以如果你有一個在64位Windows機器上運行的32位JRE,你會得到'x86'作爲結果。看到這篇文章:http://mark.koli.ch/2009/10/javas-osarch-system-property-is-the-bitness-of-the-jre-not-the-operating-system.html – MByD 2011-03-27 13:09:43

0

Unsafe.addressSize();

報告大小在天然指針的字節,作爲經由{@link #putAddress}存儲。此值將爲4或8.

您可以從此處將其取出。

+0

如果你的意思是_sun.misc.Unsafe_,那麼這是一件壞事,因爲其他Java實現不提供它。 – kayahr 2011-03-27 15:08:59

+0

@ kayahr,讓本機庫在不帶安全性的Java版本上工作的機率幾乎沒有。 – bestsss 2011-03-27 15:17:20