Java Native Interface: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti. |
||
(28 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>
{{s|informatica}}▼
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"/>
== Utilizzo di JNI ==
[[Categoria:Programmazione]]▼
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/>
|