Per chiamare da Java le funzioni della shared library, dobbiamo imparare le fondamentali tecniche di interfacciamento e di marshalling (cioè di definizione di formati dati di interscambio tra codice gestito (Java) e non gestito (libreria C).
Prima di tutto scarichiamo la libreria in formato .jar dell'ultima versione disponibile di JNA, che troviamo QUI.
Cominciando dall'interfaccia, utilizzeremo un template, cioè un po' di codice boilerplate, come lo chiamano gli Americani, per renderci la vita più semplice.
import com.sun.jna.*; import com.sun.jna.ptr.*; public class CSpice { private static CLibrary INSTANCE; static { INSTANCE = Native.load("cspice", CLibrary.class); } public interface CLibrary extends Library { //<-----------------definizione dei prototipi delle funzioni------------> } //<-----------------chiamata alle funzioni, una alla volta--------------> }
Spiegazione: l'import riguarda il core della libreria JNA e il complesso delle classi per la gestione dei puntatori, lo vediamo nel corso dello sviluppo. La classe pubblica CSpice conterrà tutto il codice per la creazione di un oggetto che sarà l'interfaccia da usare. Per il momento dò per scontato il resto del codice, fatta eccezione per la definizione statica dell'INSTANCE come
Native.Load("cspice", CLibrary.class).
Qui la libreria libcspice.so è richiamata esplicitamente, togliendo dal nome il prefisso lib e l'estensione .so. Questo vale per qualsiasi altra situazione in cui una generica libreria .so è utilizzata: libHelloWorld.so -> INSTANCE = Native.load("HelloWorld", CLibrary.class);.
Buttiamo giù un veloce file di classe Main.java, giusto per ospitare un metodo main:
public class Main { public static void main(String[] args) { CSpice spice = new CSpice(); } }
Facciamo una compilazione di prova: ricordiamoci di richiamare esplicitamente la libreria jna con l'opzione classpath:
javac -classpath .:jna-5.2.0.jar -g Main.java
Come potete apprezzare, la classe CSpice che contiene l'interfaccia viene richiamata implicitamente durante la compilazione di Main.java e il file di classe corrispondente viene creato come CSpice.class nella directory di progetto. Se facciamo il listing della directory vediamo i file seguenti:
ubuntu@ubuntu-desktop:~/Scrivania/CSpice$ ls backup.java CSpice.java libcspice.so naif0012.tls 'CSpice$CLibrary.class' de421.bsp Main.class trueepoch.tf CSpice.class jna-5.2.0.jar Main.java ubuntu@ubuntu-desktop:~/Scrivania/CSpice$
Proviamo a lanciare il programma con il comando seguente:
java -classpath .:jna-5.2.0.jar Main
Se il comando non produce output vuol dire che va tutto bene
Mi fermo qui, continuiamo nel prossimo post.
No comments:
Post a Comment