Accesso nativo Java - Java Native Access
| Autori originali | Todd Fast, Timothy Wall, Liang Chen |
|---|---|
| Versione iniziale | 9 maggio 2007 |
| Rilascio stabile | 5.8.0 / 22 marzo 2021
|
| 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 |
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
- Pagina Web Java Native Access
- Java Native Access - Pagina di download
- Java Native Access - Mailing List utente
- Friesen, Jeff (5 febbraio 2008). "Progetti Java open source: Java Native Access" . Tutorial Java open source. JavaWorld . Recuperato il 27.07.2020 .
- Morris, Stephen B. (20 maggio 2009). "Proteggi il tuo investimento in codice legacy con JNA" . oggi.java.net . Archiviato dall'originale il 13/01/2015.
- Dasgupta, Sanjay (11 novembre 2009). "Semplifica l'accesso al codice nativo con JNA" . oggi.java.net . Archiviato dall'originale il 15-11-2009.
- Doubrovkine, Daniel (20 giugno 2011). "JNA è ora un Githubber" . code.dblock.org . Recuperato il 27.07.2020 .
- Kiaer, Jesper (21 marzo 2010). "Chiamare la C-API di Lotus Domino con JNA" . Non importa.dk . Recuperato il 27.07.2020 .