Java detect 64 bit windows

Проверьте, работает ли Java-программа в 64-битной или 32-битной JVM

Узнайте, как java-программа может определить, работает ли она в 64-битной или 32-битной JVM.

Проверьте, работает ли Java-программа в 64-битной или 32-битной JVM

1. Обзор

Хотя Java независима от платформы, иногда мы должны использовать родные библиотеки. В этих случаях нам может потребоваться определить базовую платформу и загрузить соответствующие родные библиотеки на запуск.

В этом учебнике мы узнаем различные способы проверки того, работает ли программа Java на 64-битной или 32-битной JVM.

Во-первых, мы покажем, как этого достичь с помощью Системный класс.

Затем мы увидим, как использовать Java Родные доступ (JNA) Я. API для проверки битности JVM. JNA является общинной библиотекой, которая позволяет всем родным доступом.

2. Использование свойства системы sun.arch.data.model

Системный класс в Java обеспечивает доступ к внешне определенным свойствам и переменным среды. Он поддерживает Недвижимость объект, описывая конфигурацию текущей рабочей среды.

Мы можем использовать ” sun.arch.data.model ” системное свойство для идентификации bitness JVM:

System.getProperty("sun.arch.data.model");

Он содержит “32” или “64”, чтобы указать 32-битный или 64-битный СПМ, соответственно. Хотя этот подход прост в использовании, он возвращает “неизвестный”, если свойство не присутствует. Следовательно, он будет работать только с версиями 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. Использование API JNA

JNA ( Java Родные доступ ) поддерживает различные платформы, такие как macOS, Microsoft Windows, Solaris, GNU и Linux.

Он использует родные функции для загрузки библиотеки по имени и получения указателя на функцию в этой библиотеке.

3.1. Родной класс

Мы можем использовать 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 >

3.2. Класс платформы

Кроме того, мы можем использовать Платформа класса, который предоставляет упрощенную информацию о платформе.

Содержит is64Bit() метод, который определяет, является ли СПМ 64-битной или .

Давайте посмотрим, как он определяет bitness:

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; >

Вот, АРХ константа происходит от « os.arch ” собственность через Системный класс. Он используется для архитектуры операционной системы:

ARCH = getCanonicalArchitecture(System.getProperty("os.arch"), osType);

Этот подход работает для различных операционных систем, а также с различными поставщиками JDK. Следовательно, он надежнее, чем « sun.arch.data.model ” системное свойство.

4. Заключение

В этом учебнике мы узнали, как проверить версию бита JVM. Мы также наблюдали, как JNA упростила решение для нас на разных платформах.

Как всегда, полный код доступен более на GitHub .

Читайте ещё по теме:

Источник

Проверьте, работает ли программа Java в 64-битной или 32-битной JVM

Хотя 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 .

Источник

Читайте также:  Java write file to socket
Оцените статью