Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在64位JVM中加载32位.so库_Java_Cpu Architecture_Dynamic Loading_.so - Fatal编程技术网

Java 在64位JVM中加载32位.so库

Java 在64位JVM中加载32位.so库,java,cpu-architecture,dynamic-loading,.so,Java,Cpu Architecture,Dynamic Loading,.so,我们正在开发一个Java应用程序,在Linux环境下运行(目前为Ubuntu),它与一个硬件进行通信。所述硬件使用制造商提供的仅适用于x86体系结构的.so库 问题是,我们非常希望在64位JVM上运行它。在x86 JVM中加载库工作正常,但我们无法在64位版本上加载。那么,除了切换到x86JVM之外,还有其他方法可以使这个库对我的64位Java应用程序可用吗?例如,我是否可以在x64中编写另一个os包装库,然后调用x86版本,以便JVM可以加载我的64位包装器?否 您不能将32位库加载到64位进

我们正在开发一个Java应用程序,在Linux环境下运行(目前为Ubuntu),它与一个硬件进行通信。所述硬件使用制造商提供的仅适用于x86体系结构的.so库

问题是,我们非常希望在64位JVM上运行它。在x86 JVM中加载库工作正常,但我们无法在64位版本上加载。那么,除了切换到x86JVM之外,还有其他方法可以使这个库对我的64位Java应用程序可用吗?例如,我是否可以在x64中编写另一个os包装库,然后调用x86版本,以便JVM可以加载我的64位包装器?


您不能将32位库加载到64位进程的地址空间。

使用此代码,您可以检查您是否在64位pc上并加载库:

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);
    }
}

我能想到的使用32位代码的唯一方法是让另一个进程(32位)与硬件通信,并在该进程和64位JVM之间设置IPC机制。这不是小事,但肯定是可能的。@JJF-即使这样做也会因任何潜在的副作用而变得复杂到不可能的程度。本机32位代码可以修改Java对象或状态,也可以受它们的影响,这些不一定存在于单独的32位JVM中,而且几乎不可能将任何副作用传播回64位JVM。有些东西如果可以传递的话,就不能轻易地传递给子进程,比如打开的套接字或文件。我同意这不是一件小事,这取决于很多因素,尽管我没有得到OP的库与Java端交互的印象。听起来像是设备的通讯接口。我和我的同事已经做过很多次了。将设备I/O转移到单独的进程。如果是数据输入数据输出类型的接口,那么在两个进程之间移动数据应该不会很困难。