Nativní přístup Java - Java Native Access
| Původní autoři | Todd Fast, Timothy Wall, Liang Chen |
|---|---|
| První vydání | 09.05.2007 |
| Stabilní uvolnění | 5.8.0 / 22. března 2021
|
| Ú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 |
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
- Webová stránka Java Native Access
- Nativní přístup Java - stránka pro stažení
- Nativní přístup Java - seznam adresátů uživatelů
- Friesen, Jeff (5. února 2008). „Open source Java projects: Java Native Access“ . Open Source Java Tutorials. JavaWorld . Citováno 2020-07-27 .
- Morris, Stephen B. (20. května 2009). „Chraňte své investice do starého kódu pomocí JNA“ . today.java.net . Archivovány od originálu na 2015-01-13.
- Dasgupta, Sanjay (11. listopadu 2009). „Zjednodušit nativní přístup k kódu pomocí JNA“ . today.java.net . Archivovány od originálu na 2009-11-15.
- 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í Lotus Domino C-API pomocí JNA“ . Nevermind.dk . Citováno 2020-07-27 .