Ellenőrizze, hogy egy Java program fut-e 64 vagy 32 bites JVM-ben

1. Áttekintés

Bár a Java platformfüggetlen, van, amikor natív könyvtárakat kell használnunk. Ezekben az esetekben szükség lehet az alapul szolgáló platform azonosítására, és indításkor be kell tölteni a megfelelő natív könyvtárakat.

Ebben az oktatóanyagban különféle módszereket tanulhatunk meg annak ellenőrzésére, hogy egy Java program 64 vagy 32 bites JVM-en fut-e.

Először megmutatjuk, hogyan lehet ezt elérni a Rendszer osztály.

Ezután meglátjuk, hogyan lehet a Java Native Access (JNA) API-t használni a JVM bitségének ellenőrzéséhez. A JNA egy közösség által fejlesztett könyvtár, amely minden natív hozzáférést lehetővé tesz.

2. A sun.arch.data.modell Rendszer tulajdonság

A Rendszer osztály a Java-ban hozzáférést biztosít külsőleg meghatározott tulajdonságokhoz és környezeti változókhoz. Fenntartja a Tulajdonságok objektum, amely leírja az aktuális munkakörnyezet konfigurációját.

Használhatjuk asun.arch.data.modell”Rendszer tulajdonság a JVM bitségének azonosítására:

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

„32” -et vagy „64” -et tartalmaz, amely egy 32 vagy 64 bites JVM-et jelöl. Bár ez a megközelítés könnyen használható, az „ismeretlen” értéket adja vissza, ha az ingatlan nincs jelen. Ezért csak az Oracle Java verzióival fog működni.

Lássuk a kódot:

public class JVMBitVersion {public String getUsingSystemClass () {return System.getProperty ("sun.arch.data.model") + "-bit"; } // ... egyéb módszerek} 

Ellenőrizzük ezt a megközelítést egy egység teszt segítségével:

@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. A JNA API használata

A JNA (Java Native Access) különféle platformokat támogat, például macOS, Microsoft Windows, Solaris, GNU és Linux.

A natív függvényeket használja a könyvtár név szerinti betöltésére és a könyvtáron belüli függvény mutatójának lekérésére.

3.1. Anyanyelvi Osztály

Tudjuk használni POINTER_SIZE tól Anyanyelvi osztály. Ez az állandó meghatározza a natív mutató méretét (bájtban) az aktuális platformon.

A 4 érték egy 32 bites natív mutatót jelent, míg a 8 érték egy 64 bites natív mutatót:

if (com.sun.jna.Native.POINTER_SIZE == 4) {// 32-bit} else if (com.sun.jna.Native.POINTER_SIZE == 8) {// 64-bit}

3.2. Felület Osztály

Alternatív megoldásként használhatjuk a Felület osztály, amely egyszerűsített platforminformációkat nyújt.

Tartalmaz a is64Bit () módszer, amely érzékeli, hogy a JVM 64 bites vagy sem.

Lássuk, hogyan azonosítja a bitességet:

nyilvános statikus végső logikai is64Bit () {String model = System.getProperty ("sun.arch.data.model", System.getProperty ("com.ibm.vm.bitmode")); if (modell! = null) {visszatér "64" .egyenlő (modell); } if ("x86-64". egyenlő (ARCH) || "ia64". egyenlő (ARCH) || "ppc64". egyenlő (ARCH) || "ppc64le". egyenlő (ARCH) || "sparcv9" .egyenlő (ARCH) || "mips64". Egyenlő (ARCH) || "mips64el". Egyenlő (ARCH) || "amd64". Egyenlő (ARCH) || "aarch64" .egyenlő (ARCH)) {true igaz; } return Native.POINTER_SIZE == 8; }

Itt a BOLTÍV konstans származik aos.arch”Ingatlanon keresztül Rendszer osztály. Az operációs rendszer architektúrájának megszerzésére használják:

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

Ez a megközelítés különböző operációs rendszereken és különböző JDK gyártóknál is működik. Ezért megbízhatóbb, mint asun.arch.data.modell”Rendszer tulajdonság.

4. Következtetés

Ebben az oktatóanyagban megtanultuk a JVM bit verziójának ellenőrzését. Megfigyeltük azt is, hogy a JNA hogyan egyszerűsítette a megoldást számunkra a különböző platformokon.

Mint mindig, a teljes kód elérhető a GitHubon.