45
Java_JNI 1 Cours Java Native Interface de cours jni : de Java vers C/C++ et de C/C++ vers Java tilisés : JDK1.5, Visual C++ 6.0 (utilisé en ligne de commandes) et BlueJ2.0.2 Cnam Paris jean-michel Douin, version de Décembre 2004 http://jfod.cnam.fr/tp_cdi/{douin/}

Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Embed Size (px)

Citation preview

Page 1: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI1

Cours Java Native Interface

Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java

Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé en ligne de commandes) et BlueJ2.0.2

Cnam Parisjean-michel Douin,

version de Décembre 2004

http://jfod.cnam.fr/tp_cdi/{douin/}

Page 2: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI2

Sommaire

• De Java vers C/C++

• De C/C++ vers Javalecture/écriture de données d'instance et de classesinvocation de méthodes d'instance et de classescréation d'objetcréation de tableaux et de StringLevée et filtrage d'exceptionsutilisation des moniteurs (de hoare)Entrées/sorties Sériecréation de machine(s) Java

API JNI et une analogie avec l’Architecture de la machine virtuelle

Page 3: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI3

Bibliographie utilisée

Le tutorial JNI de Beth Stearns• http://java.sun.com/docs/books/tutorial/index.html• surtout : http://java.sun.com/docs/books/tutorial/native1.1/index.html• jni specification : http://java.sun.com/products/jdk/1.1/download-pdf-ps.html

Un outil bien utile distribué par Sun• http://www.experimentalstuff.com/Technologies/NativeCode/index.html• http://www.experimentalstuff.com/data/NativeCodeIsolation1.0.tar.gz

Un « essentiel » ouvrage sur le sujet• Essential JNI: Java Native Interface, rob Gordon, Prentice hall.1998 ISBN 0-13-679895-0

• le site de l ’éditeur http://www.phptr.com/

les instructions et l ’architecture de la machine virtuelle Java reflètent les fonctionnalités de l’ API JNI

• The VM specification.http://java.sun.com/docs/books/vmspec/html

Page 4: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI4

JNI Pourquoi ?

• Applications existantes dans un environnement Java, avec ou sans les sources

• Programmation d ’un périphérique, logiciel de base, Entrées/Sorties, Cartes d ’acquisition, de commandes

(Adressage physique, Accès au matériel, aux pilotes de la carte, interruptions…

• Développement en C/C++, tout en bénéficiant de l ’environnement Java IHM en Java, application en C, Applet, accès à l ’internet

• Code natif pour de meilleures performances en temps d ’exécution

• Portabilité ?

Page 5: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI5

JNI Présentation

• Deux aspectsde Java vers C/C++

de C/C++ vers Javaen venant de Java

ou depuis une application ordinaire

• L ’API JNI offre l ’accès à la machine virtuelleaccès aux variables d ’instance, appel de méthodes, chargement

d ’une classe, création d ’instances…

Mécanisme de bas-niveau...

Exceptions,

Threads….

Page 6: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI6

De Java vers C(jc)

• 1) usage du mot clé native

• 2) génération par les outils de SUN de l ’interface « .h » >javah -jni Exemple

• 3) génération de la DLL (Win32,.dll), ou de la SOL(solaris,.so)

• 4) exécution

notes :

nécessite l ’accès à $JDK_HOME\include

(en fonction de la plate-forme $JDK_HOME\include\win32(ou solaris)) et l ’exécution sous DOS de C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT 

Setting environment for using Microsoft Visual C++ tools.

Page 7: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI7

jc) 1) Le source Java

public class JavaVersC {

public native void bonjour(); // (1)

public static void main(String args[]) {

new JavaVersC().bonjour();

}

static{

System.loadLibrary("VersC"); // (2)

}

}

• >javac JavaVersC.java• (1) emploi de native• (2) chargement de la librairie (DLL/sol) dans laquelle sera implémentée

le code C de bonjour

Page 8: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI8

jc) Le source C : interface

• 2) génération de l ’interface (.h) par javah• >javah -jni JavaVersC

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class JavaVersC */#ifndef _Included_JavaVersC

#define _Included_JavaVersC

#ifdef __cplusplus

extern "C" {#endif

/* Class: JavaVersC

* Method: bonjour

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_JavaVersC_bonjour(JNIEnv *, jobject);#ifdef __cplusplus

}#endif

#endif

Page 9: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI9

jc) le source C : Implémentation

#include <stdio.h>

#include "JavaVersC.h"

JNIEXPORT void JNICALL Java_JavaVersC_bonjour (JNIEnv *env, jobject j){

printf("Java_JavaVersC_bonjour");}

• 3) Génération de la DLL, (JavaVersC.dll)Avec visual c++cl -I%JDK_HOME%\include -I%JDK_HOME%\win32 -LD JavaVersC.c -FeVersC.dll

• 4) Exécution par >java JavaVersC

Page 10: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI10

jc) JNIENV et jobject

• JNIEnv *envIl s ’agit de l ’environnement de la machine Java associé au « Thread »

courant, (le Thread ayant engendré l ’appel de la méthode native bonjour)

• jobject jIl s ’agit de l ’objet receveur du message bonjour(), ici l ’instance créée

dans la méthode main

(jclass j, dans le cas d ’une méthode de classe )

• En résuméA chaque appel d ’une méthode native sont transmis par la machine Java

un environnement

l ’objet receveur ou la classe si c'est une méthode classe

et éventuellement les paramètres

Page 11: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI11

De C vers Java(cj)

• depuis une DLL/SO engendrée par javahemploi du mot clé native

java -----native----------->C/C++

|

java <----API_JNI--------- C/C++

• ou depuis une application C/C++ ordinaire

java <----API_JNI--------- C/C++

Page 12: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI12

cj) De C vers Java

• Primitives d ’accès à la machine Java

<jni.h>Bytecode

env

j

class

Variablesd’instance

Variables declasse

Méthodes d ’instancesméthodesde classe

Source C

Page 13: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI13

Fonctions de JNI

• Versions• Opérations sur les classes• Exceptions• Références locales et globales• Opérations sur les objets• Accès aux champs des objets• Appels de méthodes d'instances• Accès aux champs statiques• Appels de méthodes de classes• Opérations sur les instances de type String• Opérations sur les tableaux• Accès aux moniteurs• Interface de la JVM

Page 14: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI14

cj) Accès aux Variables d'instance

• GetFieldID, Get<type>Field, Set<type>Field

• public class Exemple{private int x;public native void setX(int val);}

• En C : • JNIEXPORT void JNICALL Java_Exemple_setX (JNIENV *env, jobject obj, jint val){jclass classe = (*env)->GetObjectClass(env,obj);jfieldID fid = (*env)->GetFieldID(env,classe,"x","I");(*env)->SetIntField(env,obj,fid,val) ;}

instructions JVM : getfield, putfield

objVariablesd’instance

x

Page 15: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI15

Exemple.java au complet

public class Exemple{

private int x;

public native void setX(int val);

static{

System.loadLibrary("Exemple");

}

public static void main(String args[]) {

Exemple e = new Exemple();

e.setX(33);

System.out.println(" dites " + e.x);

}

}

Page 16: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI16

Exemple.c au complet

#include "Exemple.h"

JNIEXPORT void JNICALL Java_Exemple_setX(JNIEnv* env, jobject obj, jint val){

jclass cl = (*env)->GetObjectClass(env,obj);

jfieldID fid = (*env)->GetFieldID(env,cl,"x","I");

(*env)->SetIntField(env,obj,fid,val) ;

}

Page 17: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI17

Les commandes (win32) au complet

javac -classpath . Exemple.java

javah -jni -classpath . Exemple

cl /I%JDK_HOME%\include /I%JDK_HOME%\include\win32 /LD Exemple.c /FeExemple.dll

java -cp . Exemple

Page 18: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI18

Retour sur JNIENV *env

GetFieldID

SetIntField

GetObjectClass

etc...

etc...

env

en C : (*env)->GetFieldID(env,...)en C++ : env->GetFieldID(...)

Page 19: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI19

JNIENV (un extrait)

typedef const struct JNINativeInterface_ *JNIEnv;

struct JNINativeInterface_ {

void *reserved0;

jclass (JNICALL *FindClass) (JNIEnv *env, const char *name);

void (JNICALL *SetIntField)(JNIEnv *env, jobject obj, jfieldID fieldID, jint val);

jfieldID (JNICALL *GetFieldID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);

Page 20: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI20

JNIENV *env

• Inspiré du JRI de Netscape

• Chaque fonction est accessible par un déplacement fixe dans une table,

• Une table peut donc être substituée par une autre sans avoir à recompiler,

• L'implantation des fonctions de cette table est à la charge du fournisseur de la JVM,

• Le code C/C++ d'accès à la JVM devient portable

• Analogue à l'implémentation de la table des méthodes virtuelles d'une instance

Page 21: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI21

cj) Accès aux Variables de classes

• GetStaticFieldID, GetStatic<type>Field, SetStatic<type>Field

• public class Exemple{private static int x;public native void setStaticX(int val);}

• JNIEXPORT void JNICALL Java_Exemple_setStaticX

• (JNIENV *env, jobject obj, jint val){jclass classe = (*env)->GetObjectClass(env,obj);jfieldID fid = (*env)->GetStaticFieldID(env,classe,"x","I");(*env)->SetStaticIntField(env,classe,fid,val) ;}

instructions JVM : getstatic, putstatic

classe

Variables declasse

x

Page 22: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI22

cj) Appels de méthodes d ’instance

• Call<type>Method

• public class Exemple{public void p(){System.out.println( "appel de p ");}public native void callP(int val);}

• JNIEXPORT void JNICALL Java_Exemple_callP (JNIENV *env, jobject obj){

jclass classe = (*env)->GetObjectClass(env,obj);jmethodID mid = (*env)->GetMethodID(env,classe,"p","()V");(*env)->CallVoidMethod(env,obj,mid) ;}

instruction JVM : invokevirtual

obj

table desméthodes

Page 23: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI23

cj) Appels de méthodes de classe

• CallStatic<type>Method

• public class Exemple{public static void p(){System.out.println( "appel de p ");}public native void callP(int val);}

• JNIEXPORT void JNICALL Java_Exemple_callP (JNIENV *env, jobject obj){

jclass classe = (*env)->GetObjectClass(env,obj);jMethodID mid = (*env)->GetStaticMethodID(env, classe,"p", "()V");(*env)->CallStaticVoidMethod(env, classe,mid) ;}

instruction JVM : invokestatic

table desméthodes declasse

classe

Page 24: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI24

cj) Types natifs

• jni.h, interpreter.h,oobj.h,typecodes.h

• Types natifs / types java

jbyte / byte, jshort / short, jint / int

….

jobject / Object, jclass / Class, jstring / String, jarray / array,

jthrowable / Throwable

sur la palte-forme Win32

nous avons typedef jijnt long;

voir fichier %JDK_HOME%\include\win32\jni_md.h

Page 25: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI25

Signature des méthodes

• FieldType ::= BaseType | ObjectType | ArrayType• BaseType

B byte

C char

D double

F float

I int

J long

S short

Z boolean

• ObjectTypeL<classname>;

• ArrayType[ table

• MethodDescriptor ::= ( FieldType *) ReturnDescriptor• ReturnDescriptor ::= FieldType | V

V si le type retourné est void

Page 26: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI26

Signature des méthodes en "clair"

• >javap -s -private JavaVersC

Compiled from JavaVersC.java

public synchronized class JavaVersC extends java.lang.Object

/* ACC_SUPER bit set */

{

public native void bonjour();

/* ()V */

public static void main(java.lang.String[]);

/* ([Ljava/lang/String;)V */

public JavaVersC();

/* ()V */

static static {};

/* ()V */

}

Page 27: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI27

Objets et classe

• NewObject, NewObjectA,NewObjectV

création d ’une instanceobtention de la classeobtention du constructeurpassage des paramètres et création

...//en Java : ClasseA newObj = new ClasseA(10,"hello");

jclass classe = (*env)->FindClass("ClasseA");jMethodID mid = (*env)->GetMethodID(classe, "<init>",

"(ILjava/lang/String;)V");jint val = 10;jstring str = (*env)->NewStringUTF(env, "hello"); jobject newObj = (*env)->NewObject(env, classe,mid,val,str) ;}

• instruction JVM : new et invokespecial

Page 28: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI28

instanceof

• IsInstanceOf

• class A{} • class B extends A{void callP(boolean b){…};}

• ...// obj est de classe déclarée A mais constatée B

jclass classeB = (*env)->FindClass("B");

if ((*env)->IsInstanceOf(obj,classeB)){

jMethodID mid = (*env)->GetMethodID(classeB,

"callP",

"(Z)V");

jbool val = JNI_TRUE;

(*env)->CallVoidMethod(obj,mid,val) ;

}

instruction JVM : instanceof, (checkcast)

Page 29: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI29

Tableaux et String

• NewObjectArray,• public class Exemple{

public void p(){String sa = newArray(10);}public native String [] newArray(int taille);}

• ... jclass classe = (*env)->FindClass(env, "java/lang/String");jObjectArray newArr = (*env)->NewObjectArray(env, taille,classe,NULL);for(int i = 0; i< taille; i++){ str = (*env)->NewStringUTF("hello");  (*env)->SetObjectArrayElement(env, newArr,i,str); (*env)->DeleteLocalRef(env, str);}return newArr;}DeleteLocalRef -> str a 2 références, en jni et en java (gc)

instruction JVM : newarray

Page 30: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI30

Objets et ramasse miettes

• Chaque objet crée par JNI ne peut être collecté par le ramasse miettes Java, (l'objet str est référencé dans la machine Java)

DeleteLocalRef(str) // de l'exemple précédent

permet de libérér cet objet (autorise la récupération mémoire par le ramasse miettes)

NewGlobalRef(obj);

"bloque" l'objet en mémoire

Page 31: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI31

Levée d ’exceptions

• Throw ThrowNew,...

JNIEXPORT void JNICALL Java_JavaVersC_bonjour (JNIEnv *env){

jclass cl; jmethodID mid; jthrowable exc;

cl = (*env)->FindClass(env,"ExceptionVenantDeC");

mid = (*env)->GetMethodID(env,cl,"<init>","()V");

exc = (jthrowable)(*env)->NewObject(env,cl,mid);

(*env)->Throw(env,exc);

}

• instruction JVM : athrow

Page 32: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI32

Côté Java

public class ExceptionVenantDeC extends Exception{

public ExceptionVenantDeC(String msg){

super(msg);

}

public ExceptionVenantDeC(){}

}

public native static void bonjour()throws ExceptionVenantDeC; /* */

{

try{

...

}catch(ExceptionVenantDeC e){

e.printStackTrace();

}

}

Page 33: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI33

Une variante : ThrowNew

JNIEXPORT void JNICALL Java_JavaVersC_bonjour (JNIEnv *env){

jclass cl; jmethodID mid; jthrowable exc;

cl = (*env)->FindClass(env,"ExceptionVenantDeC");

(*env)->ThrowNew(env,cl," appel de (*env)->ThrowNew/3 ");

}

Page 34: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI34

Filtrage des Exceptions en C

• ExceptionClear, ExceptionOccurred, ExceptionDescribe,FatalError

jthrowable exc;

exc = (*env)->ExceptionOccurred(env);

if(exc != NULL){

// catch(Exception1 e){ …}

if((*env)->IsInstanceof(env,exc,Exception1){

……… //

(*env)->ExceptionClear();

}

}

Avec jclass Exception1 = (*env)->FindClass(env, "Exception1");

Page 35: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI35

Monitor

• MonitorEnter, MonitorExit

// l'équivalent de l'instruction synchronized(*env)->MonitorEnter(env,obj);

//du code C/C++

(*env)->MonitorExit(env,obj);}

instructions JVM : monitorenter, monitorexit

Appels de wait et notify par les primitives GetMethodID et CallVoidMethodjclass classe = (*env)->GetObjectClass(env,obj);jMethodID waitMid = (*env)->GetMethodID(env,classe,"wait","()V");(*env)->CallVoidMethod(env,obj,waitMid);if((*env)->ExceptionOccured()!=NULL)) // une exception est générée en Java, mauvais usage de Wait ...}

Page 36: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI36

Deux exemples

• Entrées/Sorties Voie Série

• Accès au « Windows Registry »

• …

Page 37: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI37

Entrées/Sorties Voie Série

• Win32Port Markus Bauer, (disponible sur http://java.cnam.fr)

• public class Win32Port{

• public native boolean open(int pnr, String par, boolean handshake);• public native void clear(int pnr);• public native void setTimeout(int pnr, int tout);• public native int getByte(int pnr);• public native int getBytes(int pnr, byte[] bytes);• public native boolean putByte(int pnr, int b);• public native int putBytes(int pnr, byte[] bytes);• public native boolean close(int pnr);

• static {• System.loadLibrary("portcom");• }}

Page 38: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI38

Accès à la base de registres sous Windows

• http://www.emunix.emich.edu/~evett/ProgrammingLanguages/Core/v2ch11/Win32RegKeyTest/

• Un lien à suivre … et à mettre en Oeuvre

Page 39: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI39

Appel de la machine Java

• le source C ordinaireutilisation de javai.lib

chargement et appel de la machine Java depuis le point d'entrée main

• le source Java ordinairen'importe quelle application

Page 40: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI40

Le source C

#include <jni.h>

int main(int argc, char *argv[]){ // declarations ici

options[0].optionString = "-Djava.class.path=."; memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 1; vm_args.options = options; res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); res = JNI_CreateJavaVM(&jvm, &env, &vm_args); classe = (*env)->FindClass(env, "CVersJava"); methodeID = (*env)->GetStaticMethodID( env,classe,"main","([Ljava/lang/String;)V");

jstr = (*env)->NewStringUTF(env," depuis du c !!!"); args = (*env)->NewObjectArray( env,1,(*env)->FindClass(env,"java/lang/String"),jstr); (*env)->CallStaticVoidMethod(env,classe,methodeID,args); (*jvm)->DestroyJavaVM(jvm); } return (0);}

Page 41: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI41

Le source Java

• public class CVersJava{ • • public static void main(String [] args){• System.out.println("en java dans main " + args[0]);• }• }

Page 42: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI42

Le source Complet (1)

#include <jni.h>#include <stdlib.h>

int main(int argc, char *argv[]){ JNIEnv *env; JavaVM *jvm; JavaVMInitArgs vm_args; JavaVMOption options[1]; jint res; jclass classe; jmethodID methodeID; jstring jstr; jobjectArray args; char classpath[1024];

options[0].optionString = "-Djava.class.path=."; options[1].optionString = "-verbose:jni"; memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 1; vm_args.options = options;

Page 43: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI43

Le source Complet (2)

res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

if (res==JNI_ERR){

printf(" erreur lors de la création de la JVM ....\n");

return 1;

}

classe = (*env)->FindClass(env, "CVersJava");

methodeID = (*env)->GetStaticMethodID( env,classe,"main","([Ljava/lang/String;)V");

jstr = (*env)->NewStringUTF(env," depuis du c !!!");

args = (*env)->NewObjectArray(env,1,(*env)->FindClass(env,"java/lang/String"),jstr);

(*env)->CallStaticVoidMethod(env,classe,methodeID,args);

(*jvm)->DestroyJavaVM(jvm);

return (0);

}

cl -I%JDK_HOME%\include -I%JDK_HOME%include\win32 SimpleHttpd.c %JDK_HOME%\lib\jvm.lib

set path = %JDK_HOME\jre\bin\client\;%path% accès à jvm.dll

Page 44: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI44

Un serveur Web depuis C …

….

res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

if (res==JNI_ERR){

printf(" erreur lors de la création de la JVM ....\n");

return 1;

}

classe = (*env)->FindClass(env, "SimpleHttpd2");

methodeID = (*env)->GetStaticMethodID( env,classe,"main","([Ljava/lang/String;)V");

args = (*env)->NewObjectArray(env,0,(*env)>FindClass(env,"java/lang/String"),NULL);

(*env)->CallStaticVoidMethod(env,classe,methodeID,args);

return (0);

}

Page 45: Java_JNI 1 Cours Java Native Interface Notes de cours jni : de Java vers C/C++ et de C/C++ vers Java Outils utilisés : JDK1.5, Visual C++ 6.0 (utilisé

Java_JNI45

Conclusion