«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.