2015-11-12 72 views
1

我們正在開發一個Java應用程序,以便在Linux環境(現在的Ubuntu)上運行,並與一個硬件進行通信。所述硬件僅使用由製造商提供的用於x86體系結構的.so庫。在64位JVM中加載32位.so庫

事情是,我們非常想在64位JVM上運行它。在x86 JVM中加載庫工作正常,但我們無法加載64位版本。因此,除了切換到x86 JVM之外,還有其他方法可以讓我的64位Java應用程序可以使用這個庫嗎?舉例來說,是否有可能在x64中編寫另一個os包裝庫,然後調用x86版本,以便JVM可以加載我的64位包裝器?

回答

6

不能在32位的庫加載到64位進程的地址空間。

+3

我可以拿出來使用32位代碼的唯一方法是讓另一個進程(32位)與該進程和64位JVM之間建立的硬件和IPC機制進行通信。不平凡但肯定可能。 – JJF

+1

@JJF - 即使這樣做可能會因爲任何潛在的副作用而變得不可能。本地32位代碼可以修改Java對象或狀態,也可以受其影響,並且這些代碼不一定會存在於單獨的32位JVM中,並且幾乎不可能傳播任何副作用返回到64位JVM。有些東西不能輕易傳遞給子進程,如果它們可以傳遞的話 - 比如打開套接字或文件。 –

+2

我同意這不是微不足道的取決於許多因素,雖然我沒有得到OP的庫與Java端交互的印象。聽起來像設備的通信接口。我和我一起工作的人都做了很多次。將設備I/O切換到單獨的進程。如果它是數據輸出接口類型的數據,則在兩個進程之間移動數據不應該很困難。 – JJF

1

與此代碼,你可以檢查,如果你是在64位PC和裝載lybrary:

boolean is64bit = System.getProperty("sun.arch.data.model").contains("64"); 
if(is64bit){ 
    try { 
     System.load("64Bit ibrary"); 
    } catch (UnsatisfiedLinkError e) { 
     System.err.println("Native code library failed to load.\n" + e); 
    } 
else{ 
    try { 
     System.load("32Bit ibrary"); 
    } catch (UnsatisfiedLinkError e) { 
     System.err.println("Native code library failed to load.\n" + e); 
    } 
} 
+0

那該怎麼解決這個問題呢? –

相關問題