Josef Vitanostra INFORMATICA PARTHENOPE
Introduzione Java Native Interface o brevemente JNI è un framework di programmazione che ha lo scopo di permettere ad applicazioni Java di interfacciarsi con funzioni scritte in altri linguaggi di programmazione, in particolare C, C++, assembly e fa parte di JDK. L uso di JNI si rende necessario quando dobbiamo interfacciarci con dispositivi che sfruttano risorse di basso livello magari native al sistema operativo sul quale lavoriamo e quindi non sfruttabili direttamente da Java. I codici Java cosi scritti ed eseguiti prendono il nome di wrapper. Prima di iniziare Assicuratevi di aver installato l ultima versione di Java, JDK e Microsoft Visual Studio se siete utenti windows oppure di avere a portata di mano un sistema Linux. Esempio errori riscontrabili su Windows: cl non è riconosciuto come commando interno o esterno, significa che dovete installare Microsoft Visual Studio poiché manca il compilatore VC. javac non è riconosciuto come comando interno o esterno, stesso discorso il compilatore java non è riconosciuto. Dobbiamo aggiungere le variabili d ambiente, quindi: Andate su Pannello di controllo\sistema\impostazioni di sistema Avanzate\Avanzate\Variabili di ambiente, ora in Variabili di Sistema cercate Path e cliccateci lasciate il nome invariato mentre in Valore Variabile scorrete fino alla fine e aggiungete il percorso fino ad arrivare all eseguibile javac. 1 P a g e
Stesso discorso vale per Cl solo che il path da aggiungere sarà: ;C:\Program Files\Microsoft Visual Studio 11.0\VC\bin Ora aprire CMD e provate a digitare cl +Invio, se vi appare questo errore: Copiate il file mspdb110.dll da: C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE 2 P a g e
to C:\Program Files\Microsoft Visual Studio 11.0\VC\bin Passiamo da C/C++ a Java Ora siamo pronti per fare un semplice programmino che possa sciogliere i dubbi sull utilizzo effettivo di JNI. Ci sono sei semplici passi da seguire per farlo: 1. Scrivere il codice in Java. Inizieremo con lo scrivere la classe java che dovrà eseguire tre istruzioni fondamentali: dichiarare il metodo nativo che dovrà essere richiamato (quello scritto in C),caricare la libreria contenente il codice nativo e richiamare il codice. 2. Compilare il codice Java. Da riga di comando compilare il codice tramite l istruzione javac. 3. Creare il file header. Cioè creare il file.h relativo al file java appena creato mediante l istruzione javah. 4. Scrivere il codice in C/C++. Cioè creeremo il file C\C++ che ci permetterà di effettuare le operazioni richieste. 5. Creare le librerie. Dobbiamo creare le librerie che ci permetteranno di far funzionare tutto. 6. Eseguire il codice java. In questo passo eseguiremo il file java creato al primo passo questo produrrà il risultato richiesto nel file C\C++. Ora seguiamo i passi. 3 P a g e
Scrivere il codice in Java Dobbiamo creare un programma in C che effettui la somma algebrica di due interi e richiamarlo da Java. Creiamo la classe Java: L istruzione native sta ad indicare che il metodo verrà caricato al tempo di runtime dall esterno. Compilare il codice Java Da riga di comando spostarsi nella cartella contenente il file.java e eseguire: istr: javac somma.java Creare il file header Ora dobbiamo creare il file Header relativo al nostro codice java, l istruzione che ci permette di farlo è javah : istr: javah jni somma 4 P a g e
Questa istruzione produrrà il seguente codice NON MODIFICATELO!! Non ponetevi il problema di capirlo non è nient altro che un file generato automaticamente per far capire a Java che il file a cui deve fare riferimento è esterno e scritto in C. Da notare è l intestazione che deve essere la stessa in C : JNIEXPORT jint JNICALL Java_somma_somma_1num (JNIEnv *, jobject, jint, jint); Indica solamente che eliminando i parametri che ha inserito Java per far capire al compilatore che il file è esterno, jint sta ad indicare che ritorna un intero e infatti la funzione dichiarata tramite native è int. 5 P a g e
Scrivere il codice in C\C++ Ora passiamo al C e scriviamo il nostro bel programmino di somma, Una volta compilato il risultato sarà libsomma.dll, come avevamo previsto, ma per farlo bisogna includere alcune librerie che ci servono. Creare le librerie Semplicemente da riga di comando includete le librerie e compilate: Su Windows eseguire da CMD: Cl -IC:\ProgramFiles\Java\jdk1.7.0_07\include -IC:\ProgramFiles\Java\jdk1.7.0_07\include\win32 -LD FILE.c FeFILE_LIBRERIA.dll Da linux Cc I/usr/java/jdk1.7.0_09/include I/usr/java/jdk1.7.0_09/include/linux FILE.c o NOME_LIBRERIA.so La cartella evidenziata in rosso è una cartella che varia a seconda della versione scaricata di Java, quindi va cambiata al momento. Successivamente se la compilazione è andata a buon fine possiamo notare nella cartella dove sono presenti i nostri file, altre librerie. Eseguire il codice in Java Da compilatore : java sommanumeri e il risultato sarà 7. 6 P a g e