1. Обзор
Хотя Java не зависит от платформы, бывают случаи, когда нам приходится использовать нативные библиотеки. В этих случаях нам может потребоваться определить базовую платформу и загрузить соответствующие собственные библиотеки при запуске.
В этом руководстве мы изучим различные способы проверки того, работает ли программа Java на 64-разрядной или 32-разрядной JVM .
Сначала мы покажем, как этого добиться с помощью класса System .
Затем мы увидим, как использовать API Java Native Access (JNA) для проверки разрядности JVM. JNA — это библиотека, разработанная сообществом, которая обеспечивает любой собственный доступ.
2. Использование системного свойства sun.arch.data.model
Класс System
в Java обеспечивает доступ к внешним свойствам и переменным среды. Он поддерживает объект 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 Native Access ) поддерживает различные платформы, такие как macOS, Microsoft Windows, Solaris, GNU и Linux.
Он использует собственные функции для загрузки библиотеки по имени и получения указателя на функцию в этой библиотеке.
3.1. Родной
класс
Мы можем использовать POINTER_SIZE
из класса Native .
Эта константа указывает размер (в байтах) собственного указателя на текущей платформе.
Значение 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
}
3.2. Класс платформы
В качестве альтернативы мы можем использовать класс 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
получена из свойства « os.arch
» через класс System .
Он используется для получения архитектуры операционной системы:
ARCH = getCanonicalArchitecture(System.getProperty("os.arch"), osType);
Этот подход работает для разных операционных систем, а также для разных поставщиков JDK. Следовательно, оно более надежно, чем системное свойство « sun.arch.data.model
».
4. Вывод
В этом уроке мы узнали, как проверить битовую версию JVM. Мы также наблюдали, как JNA упростила для нас решение на разных платформах.
Как всегда, полный код доступен на GitHub .