«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. Класс платформы
В качестве альтернативы мы можем использовать класс платформы, который предоставляет упрощенную информацию о платформе.
Он содержит метод 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.