Java Native Interface: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nuova pagina; testo: 'Java Native Interface e' l'interfaccia predisposta da java per interagire con le librerie native del sistema ospitante java stesso. In particolare, essendo molti sistemi opera...'
 
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti.
 
(30 versioni intermedie di 21 utenti non mostrate)
Riga 1:
La '''Java Native Interface''' o '''JNI''' è un [[framework]] del [[linguaggio Java]] che consente al codice Java di richiamare (o essere richiamato da) codice cosiddetto "nativo", ovvero specifico di un determinato [[sistema operativo]] o, più in generale, scritto in altri [[linguaggio di programmazione|linguaggi di programmazione]], in particolare [[C (linguaggio)|C]], [[C++]] e [[assembly]].<ref>[https://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/intro.html#wp725 Java Native Interface: Introduction]</ref> Nella letteratura in [[lingua italiana]], il nome del framework viene in genere tradotto come "interfaccia nativa Java".<ref>Vedi per esempio Jamie Jaworski, ''Java 2 tutto e oltre'' (traduzione italiana), Apogeo 1999, p. 9.</ref>
Java Native Interface e' l'interfaccia predisposta da java per interagire con le librerie native del sistema ospitante java stesso. In particolare, essendo molti sistemi operativi scritti in c, jni permette di poter interagire con le librerie sviluppate mediante tale linguaggio, dopo aver costruito una opportuna classe di ingresso e un header che consenta l'interfacciamento.
 
La principale applicazione della JNI è quella di richiamare all'interno di programmi Java porzioni di codice che svolgono funzionalità intrinsecamente non portabili (per esempio primitive di sistema operativo) e che pertanto non possono essere implementate in Java puro.<ref name="mokabyte">[http://www.mokabyte.it/2000/01/jni1.htm Java Native Interface] {{webarchive|url=https://web.archive.org/web/20111214195437/http://www.mokabyte.it/2000/01/jni1.htm |data=14 dicembre 2011 }} presso [http://www.mokabyte.it/ Mokabyte]</ref> L'interfacciamento è basato sulla definizione di un insieme di [[classe (informatica)|classi]] di raccordo fra i due contesti, che presentano una [[Interfaccia (informatica)|interfaccia]] Java, ma che delegano al codice nativo l'implementazione dei loro [[Metodo (programmazione)|metodi]].<ref name="mokabyte"/>
JNI rivela la sua utilita' nel momento in cui esiste una libreria di sistema (.dll per windows, .so per linux, etc) e la si vuole usare tramite java. Ovviamente bisogna aver chiaro quali siano le funzioni richiamabili da tale libreria per poter creare l'header di interfacciamento.
 
== Utilizzo di JNI ==
Una classe può definire un numero arbitrario di metodi implementati in codice nativo. Per far questo, nel sorgente della classe il metodo deve avere la parola-chiave <code>native</code> e deve avere un [[punto e virgola]] al posto del corpo del metodo.<ref name="mokabyte"/> Ad esempio:
 
<syntaxhighlight lang="java">
public class Classe {
public void metodo() { /* ... */ }
public native void metodoNativo();
}
</syntaxhighlight>
 
Come si evince dall'esempio, non è necessario che la classe abbia ''solo'' metodi nativi.
 
Un metodo <code>native</code> può essere <code>static</code> e anche <code>final</code>; non ha senso, invece, definire un metodo nativo come <code>abstract</code>.
 
=== Uso dei metodi nativi ===
In genere, i metodi nativi vengono mantenuti privati dalla classe che li definisce, mentre dei metodi pubblici o <code>protected</code> (invocati dai [[client]] o dalle sottoclassi) fungono da ''[[wrapper]]''. In accordo con il principio dell'incapsulamento delle informazioni, questo consente di definire un'interfaccia per la classe che sia completamente indipendente dall'uso del codice nativo; in questo modo, sarà più facile in futuro modificare il comportamento della classe mantenendo un'interfaccia nativa [[retrocompatibilità|retrocompatibile]] con le librerie native già implementate.
 
== Applicazioni pratiche ==
Il JNI viene principalmente utilizzato per consentire al programma l'accesso a funzioni definite nelle [[libreria software|librerie]] del [[sistema operativo]] ospite mediante [[chiamata di sistema|primitive di sistema]]. In realtà, l'accesso avviene in modo indiretto, nel senso che le funzioni del sistema operativo vengono invocate dalle funzioni che implementano i metodi nativi della classe che li definisce e che vengono a loro volta utilizzati dal codice Java.
 
L'uso del JNI si rende inoltre necessario quando l'implementazione di una certa funzionalità nel programma dipende dal sistema operativo in uso a ''run-time'' e non è presente nelle librerie standard di Java. Il programma risultante non può essere definito "100%-Java", in quanto esso fa direttamente uso di codice nativo.
 
Nell'implementazione Sun delle librerie standard della [[piattaforma Java]], sono molti i metodi ''native''. L'implementazione di questi metodi è presente solo nella [[macchina virtuale Java|macchina virtuale]] che verrà utilizzata a [[run-time]].
 
==JNI e portabilità==
L'utilizzo del JNI limita la portabilità del programma all'insieme delle piattaforme per le quali è realmente presente un'implementazione della libreria nativa. Questo significa che la classe che fa uso di metodi nativi non potrà essere utilizzata su ''tutti'' i sistemi per i quali è presente un [[Java Runtime Environment]]. Di fatto, un programma che faccia uso di classi con metodi nativi non può essere definito "100% Java".
 
Per questo motivo, è consigliabile utilizzare JNI solo se strettamente necessario o se il programma verrà utilizzato unicamente su un numero limitato di piattaforme specifiche.
 
Le librerie standard sono un'eccezione: l'implementazione dei metodi nativi da esse definiti è (necessariamente) presente in ''ogni'' virtual machine e spesso è addirittura necessaria per la corretta esecuzione del programma stesso.
 
==Note==
<references/>
 
{{Portale|informatica}}
 
[[Categoria:Piattaforma Java]]