Java Native Interface: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
SunBot (discussione | contributi)
m Bot: Standardizzo interwiki
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti.
 
(24 versioni intermedie di 19 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}}
In [[informatica]], la '''Java Native Interface''' (letteralmente "interfaccia nativa Java", abbreviato in '''JNI''') è un [[framework]] di [[programmazione]] che ha lo scopo di permettere ai programmi [[linguaggio Java|Java]] di richiamare [[sottoprogramma|sottoprogrammi]] scritti in altri [[linguaggio di programmazione|linguaggi di programmazione]], e in particolare [[linguaggio C|C]], [[C++]] e [[assembly]] (i cosiddetti "linguaggi nativi", da cui il nome del framework). L'interfacciamento è basato sulla definizione di un insieme di [[classe (programmazione)|classi]] di raccordo fra i due contesti, che presentano una interfaccia Java ma che delegano a codice nativo l'implementazione dei loro metodi. Lo stesso framework consente anche l'operazione inversa, ovvero l'invocazione di codice Java da parte di programmi scritti nei linguaggi nativi.
 
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"/>
L'uso principale di JNI consiste nel consentire a programmi Java di far uso di servizi implementati nelle [[libreria di sistema|librerie]] del [[sistema operativo]] ospite ([[system call|primitive di sistema]]).
 
== 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">
[[de:Java Native Interface]]
public class Classe {
[[en:Java Native Interface]]
[[es:Java Native Interface]]
public void metodo() { /* ... */ }
[[fr:Java Native Interface]]
[[ja:Java Native Interface]]
public native void metodoNativo();
[[nl:Java Native Interface]]
[[pl:Java Native Interface]]
}
[[pt:JNI]]
</syntaxhighlight>
[[ru:Java Native Interface]]
 
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/>
 
{{sPortale|informatica}}
 
[[Categoria:ProgrammazionePiattaforma Java]]