Nativní přístup Java - Java Native Access
Původní autoři | Todd Fast, Timothy Wall, Liang Chen |
---|---|
První vydání | 9. května 2007 |
Stabilní uvolnění | 5.6.0 / 19. července 2020[1] |
Úložiště | |
Napsáno | C a Jáva |
Operační systém | Windows, macOS, Android, AIX, FreeBSD, GNU /Linux, OpenBSD, Solaris, Windows Mobile |
Plošina | Jáva 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 kupředu) softwarová licence Apache, verze 2.0 |
webová stránka | github |
Nativní přístup Java (JNA) je knihovna vyvinutá komunitou, která poskytuje Jáva programy snadný přístup k nativní sdílené knihovny bez použití Nativní rozhraní Java (JNI). Cílem designu JNA je poskytnout nativní přístup přirozeným způsobem s minimem úsilí. Na rozdíl od JNI ne varná deska nebo generované kód lepidla je požadováno.
Architektura
Knihovna JNA používá malou nativní knihovnu s názvem rozhraní cizí funkce knihovna (libffi ) dynamicky vyvolat nativní kód. Knihovna JNA používá nativní funkce umožňující kódu načíst knihovnu podle názvu a načíst a ukazatel na funkci v této knihovně a používá libffi knihovna, která ji vyvolá, vše bez statické vazby, hlavičkové soubory nebo jakoukoli fázi kompilace. Vývojář používá a Rozhraní Java popsat funkce a struktury v cílové nativní knihovně. Díky tomu je docela snadné využít výhody funkcí nativní platformy, aniž by došlo k vysoké režii vývoje při konfiguraci a vytváření JNI kód.
JNA je postavena a testována na Operační Systém Mac, Microsoft Windows, FreeBSD / OpenBSD, Solaris, GNU s Linux, AIX, Windows Mobile, a Android. Je také možné vyladit a překompilovat nativní konfigurace 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 Javou a nativním kódem a podporovaných knihovnou JNA.[2]
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 / 32bitový znak | char | TCHAR |
int | 32bitové celé číslo | int | DWORD |
int | logická hodnota | booleovský | BOOL |
dlouho | 32 / 64bitové celé číslo | NativníDlouhé | DLOUHO |
dlouho dlouho | 64bitové celé číslo | dlouho | __int64 |
plovák | 32bitový FP | plovák | |
dvojnásobek | 64bitový FP | dvojnásobek | |
char * | Řetězec C. | Tětiva | LPCSTR |
neplatné * | ukazatel | Ukazatel | LPVOID, RUKOJET, 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 chuť zarovnání bajtů paměti. Výchozí nastavení JNA je pro specifické nastavení platformy OS, které lze přepsat vlastním zarovnáním specifické 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 místní C standardní knihovna implementace a používá jej k volání printf funkce.
Poznámka: Následující kód je přenosný a funguje stejně Okna a GNU +Linux / Unix / Operační Systém Mac platformy.
import com.sun.jna.Knihovna;import com.sun.jna.Nativní;import com.sun.jna.Platforma;/ ** Jednoduchý příklad deklarace a použití nativní knihovny. * /veřejnost třída Ahoj světe { veřejnost rozhraní Knihovna rozšiřuje Knihovna { Knihovna INSTANCE = (Knihovna) Rodák.loadLibrary( (Plošina.isWindows() ? "msvcrt" : "C"), Knihovna.třída); prázdnota printf(Tětiva formát, Objekt... args); } veřejnost statický prázdnota hlavní(Tětiva[] args) { Knihovna.INSTANCE.printf(„Ahoj, svět n“); pro (int i = 0; i < args.délka; i++) { Knihovna.INSTANCE.printf("Argument% d:% s n", i, args[i]); } }}
Následující program načte C POSIX knihovna a používá jej k volání standardu mkdir funkce.
Poznámka: Následující kód je přenosný a funguje stejně POSIX standardní platformy.
import com.sun.jna.Knihovna;import com.sun.jna.Nativní;/ ** Jednoduchý příklad deklarace a použití nativní knihovny C POSIX. * /veřejnost třída PříkladPOSIX { veřejnost rozhraní POSIX rozšiřuje Knihovna { veřejnost int chmod(Tětiva název souboru, int režimu); veřejnost int chown(Tětiva název souboru, int uživatel, int skupina); veřejnost int přejmenovat(Tětiva stará cesta, Tětiva nová cesta); veřejnost int zabít(int pid, int signál); veřejnost int odkaz(Tětiva stará cesta, Tětiva nová cesta); veřejnost int mkdir(Tětiva cesta, int režimu); veřejnost int rmdir(Tětiva cesta); } veřejnost statický prázdnota hlavní(Tětiva[] args) { POSIX posix = (POSIX) Rodák.loadLibrary("C", POSIX.třída); posix.mkdir(„/ tmp / newdir“, 0777); posix.přejmenovat(„/ tmp / newdir“,„/ tmp / renamedir“); }}
Níže uvedený program načte Kernel32.dll a používá jej k volání Pípnutí a Spát funkce.
Poznámka: Následující kód funguje pouze na Okna platformy.
import com.sun.jna.Knihovna;import com.sun.jna.Nativní;/ ** Jednoduchý příklad deklarace a použití nativní knihovny Windows. * /veřejnost třída Pípnutí Příklad { veřejnost rozhraní Jádro32 rozšiřuje Knihovna { // FREKVENCE je vyjádřena v hertzích a pohybuje se od 37 do 32767 // DURATION je vyjádřena v milisekundách veřejnost booleovský Pípnutí(int FREKVENCE, int DOBA TRVÁNÍ); veřejnost prázdnota Spát(int DOBA TRVÁNÍ); } veřejnost statický prázdnota hlavní(Tětiva[] args) { Jádro32 lib = (Jádro32) Rodák.loadLibrary("kernel32", Jádro32.třída); lib.Pípnutí(698, 500); lib.Spát(500); lib.Pípnutí(698, 500); }}
Viz také
Reference
- ^ „Vydání 5.6.0“. github.com. 2020-07-19.
- ^ „Výchozí mapování typů“. jna.dev.java.net. Citováno 2011-08-02.
externí odkazy
- Webová stránka Java Native Access
- Java Native Access - stránka pro stahování
- Nativní přístup Java - seznam adresátů uživatelů
- Friesen, Jeff (5. února 2008). „Open source Java projects: Java Native Access“. Výukové programy Java s otevřeným zdrojovým kódem. JavaWorld. Citováno 2020-07-27.
- Morris, Stephen B. (20. května 2009). „Chraňte své investice do původního kódu pomocí JNA“. today.java.net. Archivovány od originál dne 2015-01-13.
- Dasgupta, Sanjay (11. listopadu 2009). „Zjednodušte přístup k nativnímu kódu pomocí JNA“. today.java.net. Archivovány od originál dne 15. 11. 2009.
- Doubrovkine, Daniel (20. června 2011). „JNA je nyní Githubber“. code.dblock.org. Citováno 2020-07-27.
- Kiaer, Jesper (21. března 2010). „Volání rozhraní Lotus Domino C-API pomocí JNA“. Nevermind.dk. Citováno 2020-07-27.