Java Native Access - Java Native Access

Java Native Access
Originale forfattere Todd Fast, Timothy Wall, Liang Chen
Første utgivelse 9. mai 2007 ( 2007-05-09 )
Stabil utgivelse
5.8.0 / 22. mars 2021 ; 5 måneder siden ( 2021-03-22 )
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 .com /java-native-access /jna

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