Java Native Interface Appunti
|
|
|
- Claudio Salvi
- 9 anni fa
- Просмотров:
Транскрипт
1 Java Native Interface Appunti Riccardo Rizzo 1/8
2 Introduzione L'uso delle Java Native Interface e' giustificato tutte quelle volte che una applicazione non puo' essere scritta interamente in Java. Per esempio quando: la libreria di classi Java standard non supporta delle carateristiche dipendenti dalla piattaforma (hardware particolari); si hanno gia' delle librerie scritte in altri linguaggi; si vuole implementare del codice crtitico in un linguaggio di piu' basso livello. La libreria JNI e' il ponte fra la JVM ed il codice nativo, cioe' il codice compilato specificamente per una particolare macchina (hardware e sistema operativo). Attraverso la interfaccia JNI codice che gira in una JVM puo' invocare codice esterno (in altro linguaggio) e, attraverso un particolare meccanismo detto "invocation API", codice in altro linguaggio puo' richiamare la JVM e le applicazioni Java. Accessibilita' delle librerie Java, delle classi e della JVM da un programma in C (dal tutorial della Sun) Accessibilita' delle funzioni in codice nativo dalle classi Java (dal tutorial della Sun) Nello scrivere codice che usa codice in altro linguaggio diverso dal Java, usando i metodi nativi, occorre ricordare che i vicoli relativi alla sicurezza vengono abbattuti: il codice nativo non e' soggetto ai meccanismi di controllo cui e' soggetto il linguaggio Java. Inoltre non e' consigliabile usare metodi nativi nelle applet poiche' l'utente dovrebbe prelevare dalla rete anche il codice nativo. 2/8
3 Gli esempi negli appunti sono relativi alla comunicazione fra linguaggio Java e linguaggio C, anche se e' possibile scrivere scrivere metodi nativi in C++. I passaggi necessari alla scrittura sono indicati nella figura (dal Tutorial della Sun) : Dalla figura sopra e' chiaro che e' generata una classe Java che ingloba una o piu' chiamate ad una routine esterna. E' da evitare l'uso di una classe contenitore che raccolga tutte le chiamate esterne, sarebbe bene invece continuare ad usare la filosofia degli oggetti in Java. Vediamo un esempio relativo alla stampa di un messaggio da parte di una applicazione in C (Hello World). 3/8
4 Scrittura del codice Java L'esempio di codice e' costituito da tre righe: //Hello.java //prova del funzionamento delle routines JNI class Hello { //metodo nativo sayhello che non e' implementato //all'interno della classe public native void sayhello(); //richiama la libreria statica hello (hello.dll in windows) static {System.loadLibrary("hello"); //main della classe Hello public static void main(string[] args){ Hello h=new Hello();//istanzia un oggetto di tipo Hello h.sayhello(); //si richiama il metodo esterno sayhello System.out.println("eseguita routine"); La prima riga definisce il metodo nativo e ne determina la firma. La parola chiave native indica che sara' implementato con codice nativo ed indica al compilatore di non cercare il codice del metodo. Nella seconda riga si carica la routine in codice nativo. L'argomento di System.loadLibrary e' il nome della routne che verra' convertito in quello convenzionale per la piattaforma (per Windows hello.dll, per Solaris libhello.so). Per mezzo della parola chiave static si garantisce che quando viene caricata la classe nel sistema e' caricata anche la dll contenente il metodo nativo. Il main istanzia l'oggetto e richiama il metodo nativo. Compilazione Si compila la classe Hello.java usando javac Hello.java Creazione dell' Header Il programma javah genera un file header Hello.h a partire dal file class, l' header contiene una firma del metodo che il programma C deve rispettare. La riga di comando da usare e': javah -jni Hello Il file generato e' del tipo : 4/8
5 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Hello */ #ifndef _Included_Hello #define _Included_Hello #ifdef cplusplus extern "C" { #endif /* * Class: Hello * Method: sayhello * Signature: ()V */ JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *, jobject); #ifdef cplusplus #endif #endif La riga che contiene la firma del metodo e' JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *, jobject); Il nome del metodo, che deve essere rispettato nella creazione del programma in C, e' composto in questo modo: La dichiarazione del metodo implica la presenza di due parametri: uno di tipo JNIEnv e l'altro di tipo jobject, il significato di questi parametri sara' chiarito in seguito. 5/8
6 Scrittura del metodo nativo Il file in linguaggio C e' di questo tipo: // File Hello.c #include <jni.h> #include "Hello.h" #include <stdio.h> JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { printf("ciao Mondo\n"); return; E' necessario l'include dell'header jni.h che contiene le informazioni necessarie per fare interagire C con Java. Il nome della funzione in C deve rispettare quello generato nell'header: JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) i parametri passati hanno il seguente significato: JNIEnv *env jobject obj Puntatore utile a dare l'accesso ad un insieme di funzioni JNI che consentono di convertire i dati piu' complessi del Java a strutture usabili in C Riferimento all'oggetto chiamante, analogo al riferimento this in Java. Guardando l'esempio, questo riferimento e' relativo all'oggetto h generato dal programma in Java. Creazione della libreria condivisa Nellesempio si suppone di usare il compilatore c Microsoft Visual C liberamente disponibile al sito Microsoft. La creazione della libreria dll si ottiene con la seguente riga di comando: cl -Ic:\java\include -Ic:\java\include\win32 -LD Hello.c -Fehello.dll cl java -LD -Fe Invoca il compilatore C Deve essere sostituito con il percorso del compilatore java Indica al compilatore di creare una dll Indica il nome della dll generata dal compilatore 6/8
7 Esecuzione della applicazione La applicazione puo' essere eseguita come una normale applicazione java con il comando: java Hello Passaggio parametri fra C e Java Vediamo adesso come e' possibile scambiare informazioni fra il programma Java ed il programma in linguaggio C. Rifacendoci all'esempio precedente se il metodo sayhello prendesse un parametro intero, cioe' avesse una firma del tipo: public native void sayhello(int v) la dichiarazione in C nel file header sarebbe del tipo: JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *, jobject, jint); dove jint e' il nome C per il tipo primitivo int in Java. I nomi degli altri tipi primitivi sono: Table 1Primitive Types and Native Equivalents (dalla documentazione Java) Java Type Native Type Size in bits boolean jboolean 8, unsigned byte jbyte 8 char jchar 16, unsigned short jshort 16 int jint 32 long jlong 64 float jfloat 32 double jdouble 64 void void n/a Esempio: una funzione che calcola la radice quadrata Si suppone di usare la funzione C che calcola la radice quadrata di un numero reale e di restituire il risultato ad un programma in Java. In questo caso occorre passare un argomento a alla routine in C e prelevare il risultato. Il programma in Java potrebbe essere il seguente: //File Sqrt.java public class Sqrt{ public native double sqrt(double d); 7/8
8 static{ System.loadLibrary("sqrt"); public static void main (String[] args){ Sqrt s=new Sqrt(); double res=s.sqrt(9.1); System.out.println("Radice di 9.1=" +res); Mentre il file in linguaggio C che richiama la funzione e' del tipo: //File Sqrt.c #include <jni.h> #include "Sqrt.h" #include <math.h> JNIEXPORT jdouble JNICALL Java_Sqrt_sqrt (JNIEnv *env, jobject jobj, jdouble d) { return sqrt(d); Notare come il programma accetti un parametro di tipo jdouble e restituisca un jdouble al programma chiamante. 8/8
Le basi del linguaggio Java
Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una
Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 07. Oggetti e Java. Marzo Programmazione Java 1
Corso di Laurea Ingegneria Civile Fondamenti di Informatica Dispensa 07 Oggetti e Java Marzo 2010 Programmazione Java 1 Contenuti Il linguaggio Java Applicazioni Java e il metodo main Esempi di applicazioni
Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.
Unità Didattica 1 Linguaggio C Fondamenti. Struttura di un programma. 1 La storia del Linguaggio C UNIX (1969) - DEC PDP-7 Assembly Language BCPL - un OS facilmente accessibile che fornisce potenti strumenti
Josef Vitanostra INFORMATICA PARTHENOPE
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
Introduzione a C# Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni
Introduzione a C# Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni C#: Strumento Principe per.net Primo linguaggio orientato alle componenti della famiglia C/C++ Tutto è DAVVERO un oggetto
Lezione 6 Introduzione al C++ Mauro Piccolo
Lezione 6 Introduzione al C++ Mauro Piccolo [email protected] Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,
Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I
Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave
TIPI PRIMITIVI E CLASSI WRAPPER
I tipi primitivi come oggetti Package java.lang In varie situazioni, può essere comodo poter trattare i tipi primitivi come oggetti per passarli per riferimento a una funzione quando una funzione pretende
Uso di metodi statici. Walter Didimo
Uso di metodi statici Walter Didimo Metodi di istanza Fino ad ora abbiamo imparato a creare oggetti e ad invocare metodi su tali oggetti i metodi venivano eseguiti dagli oggetti un metodo invocato su un
Java Classi wrapper e classi di servizio. Classi di servizio
Java Classi wrapper e classi di servizio 1 Classi wrapper Concetti di base In varie situazioni, può essere comodo poter trattare i tipi primitivi come oggetti. Una classe wrapper (involucro) incapsula
Corso sul linguaggio Java
Corso sul linguaggio Java Modulo JAVA2 2.1- Funzioni 1 Prerequisiti Programmazione elementare in Java Tecnica top-down Concetto matematico di funzione Compilazione e link di programmi Esecuzione di funzioni
STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe
STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe String Una stringa Java rappresenta uno specifico valore e come
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList 1 ArrayList! Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione
Corso di Laurea Ingegneria Informatica Laboratorio di Informatica
Corso di Laurea Ingegneria Informatica Laboratorio di Informatica Capitolo 4 Traduzione ed esecuzione di programmi Ottobre 2006 Traduzione ed esecuzione di programmi 1 Nota bene Alcune parti del presente
Introduzione alla programmazione
Introduzione alla programmazione Cosa è un calcolatore? Hardware Processore Memoria Periferiche Funzionamento Esegue istruzioni elementari Esegue istruzioni molto velocemente Deve essere programmato Il
Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:
Le classi in java Un semplice programma java, formato da una sola classe, assume la seguente struttura: class Domanda static void main(string args[]) System.out.println( Quanti anni hai? ); La classe dichiarata
PROGRAMMA = ALGORITMO
Corso di Laurea Scienze Prof. San. Tec., Area Tecnico-Assistenziale SISTEMI DI ELABORAZIONE DELLE INFORMAZIONI Anno Accademico 2005-2006 Prof. Fausto Passariello Corso Integrato Metodologia della Ricerca
Fondamenti di Informatica T-1
Fondamenti di Informatica T-1 Introduzione al linguaggio Java - Input/Output, Variabili, Tipi Tutor: Allegra De Filippo [email protected] a.a. 2015/2016 Fondamenti di Informatica T-1 Allegra De
Linguaggi di Programmazione I Lezione 10
Linguaggi di Programmazione I Lezione 10 Prof. Marcello Sette mailto://[email protected] http://sette.dnsalias.org 8 maggio 2008 Array 3 Dichiarazione...........................................................
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
Introduzione a Java. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni
Introduzione a Java IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni Linguaggi di programmazione Ogni programma viene scritto utilizzando un linguaggio specializzato, formale e comprensibile da
Primi passi col linguaggio C
Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Come introdurre un linguaggio di programmazione? Obiettivi: Introduciamo una macchina astratta
Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)
Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo) Selezione di prove di esame al calcolatore Esercizio 1 (esame del 13/01/2006) La classe Matrice definisce oggetti che rappresentano matrici
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso
La programmazione ad oggetti (OOP)
Oggetti e Classi (CAP 10) Alberto Garfagnini, Marco Mazzocco Università degli studi di Padova 30 Novembre 2011 La programmazione ad oggetti (OOP) È un approccio concettuale alla programmazione (indipendente
Funzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7
IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale
Fondamenti di Informatica IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale Fondamenti di Informatica - D. Talia - UNICAL 1 Lettura di dati da input In Java la lettura di dati da input
Primo programma in C
Primo programma in C Struttura minima di un file C Applicazioni C in modo console Struttura del programma Commenti Direttive #include Definizione di variabili Corpo del main 2 Struttura minima di un file
Preprocessore, linker e libreria standard
Preprocessore, linker e libreria standard Università degli Studi di Brescia Prof. Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 IL PREPROCESSORE Programma sorgente
18 - Classi parzialmente definite: Classi Astratte e Interfacce
18 - Classi parzialmente definite: Classi Astratte e Interfacce Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/
Concetti introduttivi
Concetti introduttivi La programmazione Programma: sequenza di operazioni semplici (istruzioni e decisioni) eseguite in successione. Un programma indica al computer i passaggi da compiere per svolgere
