1.概述
尽管Java与平台无关,但是有时候我们不得不使用本机库。在这些情况下,我们可能需要识别基础平台并在启动时加载适当的本机库。
在本教程中,我们将学习检查Java程序是在64位还是32位JVM上运行的不同方法。
首先,我们将展示如何使用System类来实现这一点。
然后,我们将看到如何使用Java Native Access (JNA)API来检查JVM的位。 JNA是社区开发的库,支持所有本机访问。
2.使用sun.arch.data.model系统属性
Java中的System类提供对外部定义的属性和环境变量的访问。它维护一个描述当前工作环境配置的“ Properties
我们可以使用“ sun.arch.data.model ”系统属性来识别JVM位:
System.getProperty("sun.arch.data.model");它包含“ 32”或“ 64”,分别表示32位或64位JVM。尽管此方法易于使用,但如果不存在该属性,它将返回“未知”。因此,它将仅适用于Oracle Java版本。
让我们看一下代码:
public class JVMBitVersion { public String getUsingSystemClass() { return System.getProperty("sun.arch.data.model") + "-bit";
} //... other methods
}让我们通过单元测试来检查这种方法:
@Test
public void whenUsingSystemClass_thenOutputIsAsExpected() { if ("64".equals(System.getProperty("sun.arch.data.model"))) {
assertEquals("64-bit", jvmVersion.getUsingSystemClass());
} else if ("32".equals(System.getProperty("sun.arch.data.model"))) {
assertEquals("32-bit", jvmVersion.getUsingSystemClass());
}
}3.使用JNA API
JNA( Java本机访问)支持各种平台,例如macOS,Microsoft Windows,Solaris,GNU和Linux。
它使用本机函数按名称加载库并检索指向该库中函数的指针。
3.1 Platform类
另外,我们可以使用Platform类,它提供了简化的平台信息。
它包含**is64Bit()方法,该方法检测JVM是否为64位**。
让我们看看它如何识别位:
public static final boolean is64Bit() {
String model = System.getProperty("sun.arch.data.model",
System.getProperty("com.ibm.vm.bitmode")); if (model != null) { return "64".equals(model);
} if ("x86-64".equals(ARCH)
|| "ia64".equals(ARCH)
|| "ppc64".equals(ARCH) || "ppc64le".equals(ARCH)
|| "sparcv9".equals(ARCH)
|| "mips64".equals(ARCH) || "mips64el".equals(ARCH)
|| "amd64".equals(ARCH)
|| "aarch64".equals(ARCH)) { return true;
} return Native.POINTER_SIZE == 8;
}此处, ARCH常量是System类os.arch ”属性派生的。它用于获取操作系统体系结构:
ARCH = getCanonicalArchitecture(System.getProperty("os.arch"), osType);这种方法适用于不同的操作系统以及不同的JDK供应商。因此,它比“ sun.arch.data.model ”系统属性更可靠。
3.2 Native类
我们可以使用Native类中的POINTER_SIZE该常数指定当前平台上本机指针的大小(以字节为单位)。
值4表示32位本机指针,而值8表示64位本机指针:
if (com.sun.jna.Native.POINTER_SIZE == 4) { // 32-bit
} else if (com.sun.jna.Native.POINTER_SIZE == 8) { // 64-bit
}4。结论
在本教程中,我们学习了如何检查JVM位版本。我们还观察了JNA如何在不同平台上为我们简化了解决方案。
0 评论