Nativní přístup Java - Java Native Access

Nativní přístup Java
Původní autoři Todd Fast, Timothy Wall, Liang Chen
První vydání 09.05.2007 ( 2007-05-09 )
Stabilní uvolnění
5.8.0 / 22. března 2021 ; před 5 měsíci ( 2021-03-22 )
Úložiště
Napsáno C a Java
Operační systém Windows, macOS, Android, AIX, FreeBSD, Linux , OpenBSD, Solaris, Windows Mobile
Plošina Java 1.4 nebo novější (pro JNA 3.5.2 nebo starší), Java 1.6 pro JNA 4.0.0 a novější
Velikost 1,83 MB (archivováno)
Typ Softwarová knihovna
Licence LGPL verze 2.1 nebo novější a (od verze 4.0 a dále) licence Apache Software License, verze 2.0
webová stránka github .com /java-native-access /jna

Java Native Access ( JNA ) je komunitou vyvinutá knihovna, která poskytuje programům Java snadný přístup k nativním sdíleným knihovnám bez použití Java Native Interface (JNI). Cílem návrhu JNA je poskytnout přirozený přístup přirozeným způsobem s minimálním úsilím. Na rozdíl od JNI není vyžadován standardní dokument ani generovaný kód lepidla .

Architektura

Knihovna JNA používá k nativnímu vyvolání nativního kódu malou nativní knihovnu s názvem knihovna rozhraní zahraničních funkcí ( libffi ) . Knihovna JNA používá nativní funkce umožňující kódu načíst knihovnu podle názvu a načíst ukazatel na funkci v rámci této knihovny a k jejímu vyvolání používá knihovnu libffi , vše bez statických vazeb , hlavičkových souborů nebo jakékoli fáze kompilace. Vývojář používá rozhraní Java k popisu funkcí a struktur v cílové nativní knihovně. Díky tomu je docela snadné využívat výhody funkcí nativní platformy, aniž by došlo k vysoké režii vývoje při konfiguraci a vytváření kódu JNI .

JNA je vytvořeno a testováno na systémech macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile a Android . Je také možné vyladit a překompilovat konfigurace nativního sestavení, aby fungovaly na většině ostatních platforem, na kterých běží Java.

Typy mapování

Následující tabulka ukazuje přehled mapování typů mezi jazykem Java a nativním kódem a podporovaných knihovnou JNA.

Nativní typ Velikost Typ Java Běžné typy Windows
char 8bitové celé číslo byte BYTE, TCHAR
krátký 16bitové celé číslo krátký SLOVO
wchar_t 16/32 bitový znak char TCHAR
int 32bitové celé číslo int DWORD
int booleovská hodnota booleovský BOOL
dlouho 32/64bitové celé číslo NativeLong DLOUHO
dlouhý dlouhý 64bitové celé číslo dlouho __int64
plovák 32bitový FP plovák
dvojnásobek 64bitový FP dvojnásobek
znak * Řetězec C. Tětiva LPCSTR
prázdný* ukazatel Ukazatel LPVOID, RUKOJEŤ, LPXXX

Poznámka: Význam TCHAR se mění mezi char a wchar_t podle některých definic preprocesoru. Následuje LPCTSTR.

Zarovnání bajtů paměti pro datové struktury

Nativní knihovny nemají standardizovanou příchuť zarovnání paměťových bajtů. JNA má výchozí nastavení specifické pro platformu OS, které lze přepsat vlastním zarovnáním specifickým pro knihovnu. Pokud podrobnosti o zarovnání nejsou uvedeny v dokumentaci nativní knihovny, musí být správné zarovnání určeno metodou pokusu a omylu během implementace obálky Java.

Příklad

Následující program načte implementaci lokální standardní knihovny C a použije ji k volání funkce printf .

Poznámka: Následující kód je přenosný a funguje stejně na platformách Windows a POSIX ( GNU + Linux / Unix / macOS ).

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Simple example of native library declaration and usage. */
public class HelloWorld {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
            (Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

Následující program načte knihovnu C POSIX a použije ji k volání standardní funkce mkdir .

Poznámka: Následující kód je přenosný a funguje stejně na platformách standardů POSIX .

import com.sun.jna.Library;
import com.sun.jna.Native;

/** Simple example of native C POSIX library declaration and usage. */
public class ExampleOfPOSIX {
    public interface POSIX extends Library {
	    public int chmod(String filename, int mode);
	    public int chown(String filename, int user, int group);
	    public int rename(String oldpath, String newpath);
	    public int kill(int pid, int signal);
	    public int link(String oldpath, String newpath);
	    public int mkdir(String path, int mode);
	    public int rmdir(String path);
    }

    public static void main(String[] args) {
        // It is possible to load msvcrt for its partial POSIX support on Windows...
        POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class);
        // but it will still fail on Windows due to /tmp being missing.
	    posix.mkdir("/tmp/newdir", 0777);
	    posix.rename("/tmp/newdir","/tmp/renamedir");
    }
}

Níže uvedený program načte soubor Kernel32.dll a použije jej k volání funkcí Beep a Sleep .

Poznámka: Následující kód funguje pouze na platformách Windows .

import com.sun.jna.Library;
import com.sun.jna.Native;

/** Simple example of Windows native library declaration and usage. */
public class BeepExample {
    public interface Kernel32 extends Library {
        // FREQUENCY is expressed in hertz and ranges from 37 to 32767
        // DURATION is expressed in milliseconds
        public boolean Beep(int FREQUENCY, int DURATION);
        public void Sleep(int DURATION);
    }

    public static void main(String[] args) {
	    Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
	    lib.Beep(698, 500);
	    lib.Sleep(500);
	    lib.Beep(698, 500);
    }
}

Viz také

Reference

externí odkazy