Archivi tag: JNA

Java Native Access (JNA)

Java Native AccessParliamo di una libreria davvero interessante che potrebbe risolvere non pochi problemi nel lavoro quotidiano: JNA, ovvero come utilizzare una DLL di Windows direttamente dal linguaggio Java. Java Native Access (JNA) è una libreria open source che permette di invocare funzioni presenti in librerie del sistema operativo in maniera molto rapida e con la scrittura di poche righe di codice.

A differenza delle librerie JNI (Java Native Interface), per utilizzare JNA non sono richiesti dei passaggi aggiuntivi di preparazione, come la generazione di file intermedi o la compilazione di codice nativo. JNA nasconde al programmatore tutti i dettagli “scomodi” per consentirgli di concentrarsi direttamente sull’obiettivo da realizzare. Al programmatore Java, infatti, è lasciato il solo compito di definire l’interfaccia delle funzioni esportate dalla libreria e queste divengono direttamente utilizzabili. Niente generazione di file di intestazione, niente scrittura o compilazione di codice nativo: solo scrittura di codice Java.

La “magia” diventa possibile attraverso la generazione automatica di stub per le interfacce native, eseguita da JNA al primo tentativo di utilizzo della libreria. Tali stub sono responsabili dell’effettiva traduzione dei tipi di dati (eseguono una conversione in entrambe le direzioni) e del collegamento al codice nativo da eseguire.

Ecco un esempio di codice Java che utilizza le librerie JNA per eseguire una chiamata ad una DLL definita in precedenza. Il codice presuppone che la libreria si trovi nel classpath dell’applicazione con nome “MiaLibreriaNativa.dll” ed abbia una funzione denominata “sayHello” con parametri e valore di ritorno “void”.

import com.sun.jna.Library;
import com.sun.jna.Native;
 
public interface LibreriaNativa extends Library {
    public static LibreriaNativa INSTANCE = (LibreriaNativa) Native.loadLibrary("MiaLibreriaNativa.dll", LibreriaNativa.class);
 
    public void sayHello();
}

Con tali accorgimenti è stata definita l’interfaccia Java LibreriaNativa la cui definizione è del tutto simile a quella della corrispondente interfaccia nativa definita nella libreria DLL. La variabile INSTANCE è lo stub generato da JNA (tramite il metodo loadLibrary della classe Native) che consente l’utilizzo della funzione esportata.

La libreria così “importata” in Java può essere utilizzata in maniera molto semplice attraverso le istruzioni seguenti.
Continua a leggere