Java Native Interface: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
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>[http://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>
{{F|informatica|febbraio 2013}}
'''Java Native Interface''' o '''JNI''' (letteralmente ''interfaccia nativa Java'') è il nome di un [[framework]] di [[programmazione]] che ha lo scopo di permettere ad [[applicazioni]] [[Java (linguaggio)|Java]] di [[Interfaccia (informatica)|interfacciarsi]] con [[funzione (informatica)|funzioni]] scritte in altri [[linguaggio di programmazione|linguaggi di programmazione]], in particolare [[C (linguaggio)|C]], [[C++]] e [[assembly]].
 
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 posso essere implementate in Java puro.<ref name="mokabyte">[http://www.mokabyte.it/2000/01/jni1.htm Java Native Interface] 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 tramite codice nativo del sistema operativo per il quale si sta scrivendo il programma.
 
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]]. Lo stesso framework consente anche l'operazione inversa, ovvero l'invocazione di codice Java da parte di programmi scritti nei linguaggi nativi.
 
Il ''mapping'' effettuato, ovviamente, dipende dal linguaggio nativo scelto; ad esempio, se si fa uso del C, ad ogni metodo della classe corrisponderà una funzione di libreria con un nome ben preciso.
 
== 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:
{{...}}
 
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 ''native'' e deve avere un punto e virgola al posto del corpo del metodo. Ad esempio:
 
<source lang="java">
Riga 25 ⟶ 18:
Come si evince dall'esempio, non è necessario che la classe abbia ''solo'' metodi nativi.
 
Un metodo ''<code>native''</code> può essere statico<code>static</code> oe dianche istanza<code>final</code>; esso può essere ''final'' o meno. Nonnon ha senso, viceversa, definire un metodo nativo come ''<code>abstract''</code>.
 
Un metodo ''native'' può essere statico o di istanza; esso può essere ''final'' o meno. Non ha senso definire un metodo nativo come ''abstract''.
 
 
=== 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 ''clients''client o dalle sottoclassi) fungono da ''[[Wrapper|''wrappers''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 [[retrcompatibilità|retrocompatibile]] con le librerie native già implementate.
 
In genere, i metodi nativi vengono mantenuti privati dalla classe che li definisce, mentre dei metodi pubblici o ''protected'' (invocati dai ''clients'' o dalle sottoclassi) fungono da [[Wrapper|''wrappers'']]. 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 retrocompatibile con le librerie native già implementate.
 
== Applicazioni pratiche ==