2015-11-12 119 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

那该怎么解决这个问题呢? –

相关问题