在 64 位 JVM 中加载 32 位 .so 库
Loading a 32bit .so library in a 64bit JVM
我们正在开发 Java 应用程序 运行 在 Linux 环境(目前为 Ubuntu)上与硬件进行通信。所述硬件使用制造商提供的 .so 库,仅适用于 x86 架构。
事实是,我们非常希望 运行 在 64 位 JVM 上执行此操作。在 x86 JVM 中加载库工作正常,但我们无法在 64 位版本上加载。那么,除了切换到 x86 JVM 之外,还有其他方法可以让我的 64 位 Java 应用程序使用这个库吗?是 possible,例如,我在 x64 中编写另一个 os 包装器库,它又调用 x86 版本以便 JVM 可以加载我的 64 位包装器?
没有
您不能将 32 位库加载到 64 位进程的地址 space。
使用此代码,您可以检查您是否在 64 位电脑上并加载 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);
}
}
我们正在开发 Java 应用程序 运行 在 Linux 环境(目前为 Ubuntu)上与硬件进行通信。所述硬件使用制造商提供的 .so 库,仅适用于 x86 架构。
事实是,我们非常希望 运行 在 64 位 JVM 上执行此操作。在 x86 JVM 中加载库工作正常,但我们无法在 64 位版本上加载。那么,除了切换到 x86 JVM 之外,还有其他方法可以让我的 64 位 Java 应用程序使用这个库吗?是 possible,例如,我在 x64 中编写另一个 os 包装器库,它又调用 x86 版本以便 JVM 可以加载我的 64 位包装器?
没有
您不能将 32 位库加载到 64 位进程的地址 space。
使用此代码,您可以检查您是否在 64 位电脑上并加载 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);
}
}