Accesso nativo Java - Java Native Access

Accesso nativo Java
Autori originali Todd Fast, Timothy Wall, Liang Chen
Versione iniziale 9 maggio 2007 ( 2007-05-09 )
Rilascio stabile
5.8.0 / 22 marzo 2021 ; 5 mesi fa ( 2021-03-22 )
Repository
Scritto in C e Java
Sistema operativo Windows, macOS, Android, AIX, FreeBSD, Linux , OpenBSD, Solaris, Windows Mobile
piattaforma Java 1.4 o successivo (per JNA 3.5.2 o precedente), Java 1.6 per JNA 4.0.0 e successivo
Taglia 1,83 MB (archiviati)
Tipo Libreria software
Licenza LGPL versione 2.1 o successiva e (dalla versione 4.0 in poi) l'Apache Software License, versione 2.0
Sito web github .com /java-native-access /jna

Java Native Access ( JNA ) è una libreria sviluppata dalla comunità che fornisce ai programmi Java un facile accesso alle librerie condivise native senza utilizzare Java Native Interface (JNI). Il design di JNA mira a fornire l'accesso nativo in modo naturale con il minimo sforzo. A differenza di JNI, non è richiesto alcun boilerplate o codice colla generato .

Architettura

La libreria JNA utilizza una piccola libreria nativa chiamata libreria di interfaccia delle funzioni esterne ( libffi ) per invocare dinamicamente il codice nativo . La libreria JNA utilizza funzioni native che consentono al codice di caricare una libreria per nome e recuperare un puntatore a una funzione all'interno di quella libreria e utilizza la libreria libffi per invocarla, il tutto senza collegamenti statici , file di intestazione o qualsiasi fase di compilazione. Lo sviluppatore utilizza un'interfaccia Java per descrivere funzioni e strutture nella libreria nativa di destinazione. Ciò rende abbastanza facile sfruttare le funzionalità della piattaforma nativa senza incorrere nell'elevato sovraccarico di sviluppo della configurazione e della creazione del codice JNI .

JNA è costruito e testato su macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile e Android . È anche possibile modificare e ricompilare le configurazioni di build native per farlo funzionare sulla maggior parte delle altre piattaforme che eseguono Java.

Tipi di mappatura

La seguente tabella mostra una panoramica della mappatura dei tipi tra Java e il codice nativo e supportata dalla libreria JNA.

Tipo nativo Taglia Tipo Java Tipi comuni di Windows
char intero a 8 bit byte BYTE, TCHAR
breve intero a 16 bit breve PAROLA
wchar_t Carattere a 16/32 bit char TCHAR
int intero a 32 bit int DWORD
int valore booleano booleano BOOL
lungo Intero a 32/64 bit Nativo Lungo LUNGO
lungo lungo intero a 64 bit lungo __int64
galleggiante FP a 32 bit galleggiante
Doppio FP a 64 bit Doppio
carattere * C stringa Corda LPCSTR
vuoto* puntatore puntatore LPVOID, MANIGLIA, LPXXX

Nota: il significato di TCHAR cambia tra char e wchar_t secondo alcune definizioni del preprocessore. LPCTSTR segue.

Allineamento dei byte di memoria per le strutture di dati

Le librerie native non hanno un tipo di allineamento dei byte di memoria standardizzato. L'impostazione predefinita di JNA è un'impostazione specifica della piattaforma del sistema operativo, che può essere sovrascritta da un allineamento personalizzato specifico della libreria. Se i dettagli dell'allineamento non sono forniti nella documentazione della libreria nativa, l'allineamento corretto deve essere determinato per tentativi ed errori durante l'implementazione del wrapper Java.

Esempio

Il seguente programma carica l' implementazione della libreria standard C locale e la usa per chiamare la funzione printf .

Nota: il codice seguente è portatile e funziona allo stesso modo su piattaforme Windows e 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]);
        }
    }
}

Il seguente programma carica la libreria C POSIX e la usa per chiamare la funzione mkdir standard .

Nota: il codice seguente è portabile e funziona allo stesso modo su piattaforme 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");
    }
}

Il programma seguente carica il Kernel32.dll e lo utilizza per chiamare le funzioni Beep e Sleep .

Nota: il codice seguente funziona solo su piattaforme 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);
    }
}

Guarda anche

Riferimenti

link esterno