Tuesday, March 5, 2019

JAVA, JNA, codice unmanaged e marshalling

Lavorare su codice nativo non gestito da un ambiente operativo diverso da quello di produzione non è sempre facile, ma spesso non avete alternative. Pensate al nostro JPL toolkit, scritto in C e Fortran. Avreste voglia di riscrivere tutto in Python o in Java? sono centinaia di funzioni, non è il caso. Questo vale per molte situazioni diverse, pensate alle librerie scientifiche compilate in Fortran negli anni dei pionieri, o a tutto il codice generato dalle vecchie versioni Visual Studio (non so se interoperabilità COM vi ricorda qualcosa). Anche la nostra piccola shared library compilata qualche post fa, libcspice.so o la sua equivalente in Windows libcspice.dll rischia di restare un bel giocattolo se non troviamo il modo di riutilizzarla con i compilatori o interpreti scritti in altri linguaggi. Abbiamo esplorato un po' ctypes di Python, ora voglio iniziare, come accennato nel post precedente, a JNA di Java.

Per questo piccolo progetto non usero', almeno prima di un certo numero di post, un IDE grafico come Eclipse o Netbeans, preferisco, per semplicità e beneficio didattico, fare tutte le compilazioni da riga di comando. Userò, come compilatore C per JPL SPICE il GNU gcc (ma trovate tutto già spiegato nei post precedenti) e come compilatore java openjdk (una qualsiasi versione successiva alla 7 va bene, attualmente nella mia Ubuntu 18.10 uso la versione 11.0.2). Se operate in ambiente windows, vista l'elevata portabilità di Java, potremo facilmente usare la linea di comando in una finestra terminale, se volete un compilatore C per questa piattaforma avete ampia libertà di scelta, c'è Visual Studio, oppure Mingw che riproduce un ambiente POSIX sotto Windows, vedete voi cosa preferite, alla fine di tutto faro' io un post apposito).

La prima cosa che faremo sarà creare una directory dedicata al progettino Java sul desktop o in qualsiasi posizione comoda per lavorare. All'interno collocheremo alcuni file creati precedentemente, come vi mostra lo schemino seguente.

ubuntu@ubuntu-desktop:~/Scrivania/CSpice$ ls -l
totale 20596
-rw-rw-r-- 1 ubuntu ubuntu 16788480 mar  2 10:56 de421.bsp
-rwxrwxr-x 1 ubuntu ubuntu  4281824 mar  2 10:45 libcspice.so
-rw-rw-r-- 1 ubuntu ubuntu     5257 mar  2 11:00 naif0012.tls
-rwxrwxrwx 1 ubuntu ubuntu      598 ago 12  2017 trueepoch.tf
ubuntu@ubuntu-desktop:~/Scrivania/CSpice$

Riepilogando:

libcspice.so è la libreria condivisa che contiene le funzioni del JPL toolkit (per un accesso veloce ai metodi di compilazione partite da Questo post in avanti)

de421.bsp è il file delle effemeridi fornito dal sito ftp della NASA. Se volete un file più recente c'è ampia scelta, il 421 ha il pregio di essere abbastanza leggero e portabile anche in ambiente Android.

naif0012.tls è il kernel generico che contiene l'elenco aggiornato dei leapsecond (secondo intervalare in italiano), ricordate che si tratta della ".. correzione del tempo applicata al tempo coordinato universale (UTC) per mantenerlo allineato al giorno solare medio, l'ente responsabile della regolazione è l'International Earth Rotation and Reference Systems Service (IERS) (sorgente Wikipedia). Trovate l'elenco dei kernel disponibili in questa pagina.

Infine trueepoch.tf è il kernel creato da me seguendo le istruzioni fornite dal NAIF in questa pagina , che servirà più avanti per svincolarsi dal frame di riferimento inerziale e spostarsi su un frame dinamico come quello che usano gli astrologi. Trovate i dettagli per la sua costruzione nei miei post precedenti già citati.

A questo punto possiamo iniziare a scrivere un po' di codice Java. Per semplicità metto tutto nella stessa directory, rinunciando a creare un package, nulla vieta di strutturare meglio il progetto, lo faremo in seguito.
Dopo questa lunga premessa, passo al post successivo per la scrittura delle prime classi Java che ci servono.

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...