Categorie
Programmazione

Java Native Access (parte 1) – Introduzione

Se è necessario accedere a delle funzionalità offerte da librerie native compilate per il sitema su cui girerà il nostro programma (host), si utlizzano le JNI. Attraverso di esse è possibile scrivere una nostra libreria in codice nativo (C, C++) che fa da ponte tra la nostra class Java e i metodi della libreria nativa che intendiamo utilizzare.

Con la libreria Java Native Access (JNA) non è più necessario. Essa ci consente di accedere alle risorse di una libreria dinamica (ovvero shared) scrivendo solo codice Java.

Per chi conosce Python, avrà sentito parlare di CTypes che realizza qualcosa di molto simile. Vi consiglio anche di dare un’occhiata a SWIG, ma adesso concentriamoci su JNA.

JNA permette di accedere solo alle risorse di librerie shared o dinamiche (.so in Linux, .dll in windows). Il perché non è possibile utilizzare librerie statiche (.a o .lib) è chiaro se si tiene conto del fatto che sono una sorta di archivio che deve essere staticamente linkato nell’eseguibile. Dato che non è possibile caricare una libreria statica a runtime, è chiaro che non è possibile utilizzare le JNA per servirsene.

Le risorse di una libreria nativa vanno mappate all’interno della classe Java tenendo conto di una relazione di equivalenza tra i tipi. Attraverso particolari classi presenti nella libreria è possibile rappresentare structure, union, array, puntatori… da passare ai metodi della libreria nativa.

Alcune caratteristiche:

  • mapping automatico da Java a funzioni native
  • portabile (speciali metodi consentono di caricare dinamicamente librerie adatte al sistema operativo dell’host)
  • conversione automatica tra stringhe C e stringhe Java
  • Structure, Union, puntatori
  • puntatori a funzione
  • marshalling/unmarshalling degli argomenti e dei valori di ritorno
  • supporto a varargs

Nei post che seguiranno al riguardo vedremo degli esempi concreti di utilizzo della libreria. Nel frattempo potete scaricarla su github

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *