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 评论