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 от родния клас. Тази константа указва размера (в байтове) на естествения указател на текущата платформа.
Стойност 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.