Tuesday, March 5, 2019

JNA e jpl toolkit - creazione dell'interfaccia

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

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...