Java Native Interface Appunti



Documenti analoghi
Programmazione. Android

Le basi del linguaggio Java

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 07. Oggetti e Java. Marzo Programmazione Java 1

Introduzione a Java. Riferimenti

Programmazione. Android

Architetture Applicative Altri Esempi

Programmazione in Java e gestione della grafica (I modulo) Lezione 2: Prime nozioni di Java

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Programmazione I - corso B a.a prof. Viviana Bono

Josef Vitanostra INFORMATICA PARTHENOPE

3) Descrivere l architettura di un elaboratore tramite astrazione a livelli

Laboratorio di Programmazione Laurea in Bioinformatica

Introduzione a C# Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Usare e costruire oggetti. Concetti Fondamentali. Interfaccia Pubblica di una. Application Program Interface

Passaggio dei parametri

Introduzione a Java e all'ambiente di sviluppo

Capitolo 1. Introduzione. Cay S. Horstmann Concetti di informatica e fondamenti di Java

L oggetto creato. Creazione di Oggetti. Rectangle: il concetto 10. Costruzione. Lo spazio di memoria del linguaggio Java. Rectangle: l oggetto

Astrazione. Lab.Calc. AA 2007/08 2

MS Visual Studio: Linea di Comando

Lezione 6 Introduzione al C++ Mauro Piccolo

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Burocrazia: Primi passi con il linguaggio C. Diversi tipi di linguaggio. Un solo linguaggio

Esonero di Informatica I. Ingegneria Medica

Programmazione ad Oggetti. Java Parte II

Indice. Introduzione a tool per lo sviluppo e l'esecuzione di programmi in linguaggio Java. Compilazione ed esecuzione di un programma

Java SE 7. Introduzione.

Programmazione in Java e gestione della grafica. Lezione 6

AMBIENTI DI PROGRAMMAZIONE

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

TIPI PRIMITIVI E CLASSI WRAPPER

AMBIENTI DI PROGRAMMAZIONE

Uso di metodi statici. Walter Didimo

Linguaggi di programmazione

Java Classi wrapper e classi di servizio. Classi di servizio

Indice. Introduzione a tool per lo sviluppo e l'esecuzione di programmi in linguaggio Java. Compilazione ed esecuzione di un programma

Introduzione al linguaggio C

Introduzione alla Programmazione in Java attraverso un esempio commentato

Corso sul linguaggio Java

{4, 4, 2, 9, 13} {2, 2, 9, 13, 0} {0, 4, 2, 9, 13} {2, 9, 13, 0, 0}

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

Esempio su strutture dati dinamiche: ArrayList

Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010

Determinazione del tipo

Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi

Dati due punti sul piano calcolare la loro distanza

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

Introduzione alla programmazione

Dichiarazioni e tipi predefiniti nel linguaggio C

Introduzione a Java. Giovanni Pardini Dipartimento di Informatica Università di Pisa.

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

Prof. Pagani corrado JAVA

Variabili e Funzioni. Informatica 1 / 19

I L IN I GU G AGG G I G O

JAVA IL LINGUAGGIO. Ogni valore nel linguaggio ha un tipo Ogni variabile deve essere dichiarata ed associata ad un tipo:

Lezione 5: Introduzione alla programmazione in C

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Riassunto. I mattoni di base di un programma Java. Oggi. Un programma complicato. Oggi. Perché è complicato? Stefano Mizzaro 1.

Introduzione a Java. 1 Java: Introduzione. Sommario. Concetti di base. Classi e oggetti. Compilazione ed esecuzione. Sommario

PROGRAMMA = ALGORITMO

Fondamenti di Informatica T-1

Linguaggi di Programmazione I Lezione 10

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Linguaggi di Programmazione I Lezione 7

Introduzione a Java. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni

Primi passi col linguaggio C

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

Passare argomenti al programma

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Primo esempio di un programma Java

IL LINGUAGGIO JAVA. Introduzione alla sintassi di Java La sintassi formalizza le regole sintattiche per scrivere frasi ben formate

Esempi di programmi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa E01. A. Miola Settembre 2007

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Variabili e Metodi di classe Interfacce e Package File in Java

La programmazione ad oggetti (OOP)

Funzioni, Stack e Visibilità delle Variabili in C

Uso di GCC da riga di comando

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Primo programma in C

Perché il linguaggio C?

Java e i Tipi di dati primitivi. Parte 3

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Fondamenti di Informatica T-1

Preprocessore, linker e libreria standard

Linea di comando. Compilazione. Aprire una shell di DOS tramite:

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Concetti introduttivi

Transcript:

Java Native Interface Appunti Riccardo Rizzo 1/8

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

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

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

/* 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

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++ 4.0 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

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

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