Java Native Access - Java Native Access
| Originale forfattere | Todd Fast, Timothy Wall, Liang Chen |
|---|---|
| Første utgivelse | 9. mai 2007 |
| Stabil utgivelse | 5.8.0 / 22. mars 2021
|
| Oppbevaringssted | |
| Skrevet inn | C og Java |
| Operativsystem | Windows, macOS, Android, AIX, FreeBSD, Linux , OpenBSD, Solaris, Windows Mobile |
| Plattform | Java 1.4 eller nyere (for JNA 3.5.2 eller tidligere), Java 1.6 for JNA 4.0.0 og nyere |
| Størrelse | 1.83 MB (arkivert) |
| Type | Programvarebibliotek |
| Tillatelse | LGPL versjon 2.1 eller nyere og (fra versjon 4.0 og fremover) Apache Software License, versjon 2.0 |
| Nettsted | github |
Java Native Access ( JNA ) er et samfunnsutviklet bibliotek som gir Java- programmer enkel tilgang til innfødte delte biblioteker uten å bruke Java Native Interface (JNI). JNAs design tar sikte på å gi innfødt tilgang på en naturlig måte med et minimum av innsats. I motsetning til JNI, er det ikke nødvendig med noen kjeleplater eller generert limkode .
Arkitektur
JNA -biblioteket bruker et lite innfødt bibliotek kalt utenlandsk funksjonsgrensesnittbibliotek ( libffi ) for dynamisk å påkalle innfødt kode . JNA -biblioteket bruker innfødte funksjoner som tillater kode å laste et bibliotek med navn og hente en peker til en funksjon i biblioteket, og bruker libffi -biblioteket til å påberope det, alt uten statiske bindinger , topptekster eller noen kompileringsfase. Utvikleren bruker et Java -grensesnitt for å beskrive funksjoner og strukturer i det opprinnelige biblioteket. Dette gjør det ganske enkelt å dra nytte av native plattformfunksjoner uten å pådra seg den høye utviklingsomkostningen ved å konfigurere og bygge JNI -kode.
JNA er bygget og testet på macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile og Android . Det er også mulig å justere og kompilere de opprinnelige byggkonfigurasjonene for å få det til å fungere på de fleste andre plattformer som kjører Java.
Kartleggingstyper
Tabellen nedenfor viser en oversikt over typer kartlegging mellom Java og opprinnelig kode og støttes av JNA -biblioteket.
| Innfødt type | Størrelse | Java Type | Vanlige Windows -typer |
|---|---|---|---|
| røye | 8-bits heltall | byte | BYTE, TCHAR |
| kort | 16-bits heltall | kort | ORD |
| wchar_t | 16/32-biters tegn | røye | TCHAR |
| int | 32-bits heltall | int | DWORD |
| int | boolsk verdi | boolsk | KUL |
| lang | 32/64-bits heltall | NativeLong | LANG |
| lenge lenge | 64-bits heltall | lang | __int64 |
| flyte | 32-biters FP | flyte | |
| dobbelt | 64-biters FP | dobbelt | |
| røye * | C streng | String | LPCSTR |
| tomrom* | pekeren | Peker | LPVOID, HÅNDTAK, LPXXX |
Merk: Betydningen av TCHAR endres mellom char og wchar_t i henhold til noen forhåndsbehandlerdefinisjoner. LPCTSTR følger.
Minnebytejustering for datastrukturer
Innfødte biblioteker har ingen standardisert minne -bytejusteringssmak. JNA har som standard en OS -plattformsspesifikk innstilling, som kan overstyres av en bibliotekspesifikk tilpasset justering. Hvis justeringsdetaljene ikke er angitt i dokumentasjonen til det opprinnelige biblioteket, må riktig justering bestemmes av prøving og feiling under implementeringen av Java -innpakningen.
Eksempel
Følgende program laster inn den lokale C -standardbibliotekimplementeringen og bruker den til å kalle printf -funksjonen.
Merk: Følgende kode er bærbar og fungerer på samme måte på Windows og POSIX ( GNU + Linux / Unix / macOS ) plattformer.
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]);
}
}
}
Følgende program laster C POSIX -biblioteket og bruker det til å kalle standard mkdir -funksjonen.
Merk: Følgende kode er bærbar og fungerer på samme måte på POSIX -standardplattformer.
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");
}
}
Programmet nedenfor laster Kernel32.dll og bruker det til å kalle pip- og hvilefunksjonene .
Merk: Følgende kode fungerer bare på Windows -plattformer.
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);
}
}
Se også
Referanser
Eksterne linker
- Java Native Access -webside
- Java Native Access - nedlastingsside
- Java Native Access - brukerliste
- Friesen, Jeff (5. februar 2008). "Java -prosjekter med åpen kildekode: Java Native Access" . Open Source Java -opplæringsprogrammer. JavaWorld . Hentet 2020-07-27 .
- Morris, Stephen B. (20. mai 2009). "Beskytt din eldre kodeinvestering med JNA" . i dag.java.net . Arkivert fra originalen 2015-01-13.
- Dasgupta, Sanjay (11. november 2009). "Forenkle tilgang til opprinnelig kode med JNA" . i dag.java.net . Arkivert fra originalen 2009-11-15.
- Doubrovkine, Daniel (20. juni 2011). "JNA er nå en Githubber" . code.dblock.org . Hentet 2020-07-27 .
- Kiaer, Jesper (21. mars 2010). "Kaller Lotus Domino C-API med JNA" . Nevermind.dk . Hentet 2020-07-27 .