Interfaçage Java et C/C++

18
Interfaçage Java et C/C++ Présentation de Système Ecole : Ingénieurs 2000 Filière : Informatique & Réseaux Auteur : Cyril MOQUEREAU

description

Interfaçage Java et C/C++. Présentation de Système Ecole : Ingénieurs 2000 Filière : Informatique & Réseaux Auteur : Cyril MOQUEREAU Année : 2001/2002. Plan d’étude. Le principe de fonctionnement Prise en main Les possibilités de la JNI - PowerPoint PPT Presentation

Transcript of Interfaçage Java et C/C++

Page 1: Interfaçage Java et C/C++

Interfaçage Java et C/C++

Présentation de Système

Ecole : Ingénieurs 2000

Filière : Informatique & Réseaux

Auteur : Cyril MOQUEREAU

Année : 2001/2002

Page 2: Interfaçage Java et C/C++

Plan d’étude

Le principe de fonctionnement Prise en main

Les possibilités de la JNI Manipulation des Strings, des tableaux, objets Java, etc...

Les limites d ’utilisation Portabilité, Efficacité, Sécurité

Page 3: Interfaçage Java et C/C++

I. Cas d’utilisation de la JNI

Accéder aux ressources système

Utiliser du code déjà implémenté

Coder une partie critique d ’un programme

Page 4: Interfaçage Java et C/C++

Présentation d’un exemple Les objectifs :

Interfacer un programme Java avec du code C Décomposer la réalisation Observer les principes de base

Les étapes de réalisation :

1. Réalisation d’un programme Java

2. Création du fichier de prototypage

3. Implémentation des méthodes natives

4. Compilation / Exécution du programme

Page 5: Interfaçage Java et C/C++

1ère étape : Réalisation du programme Java

class HelloWorld {

public native void displayHelloWorld();

static {

System.loadLibrary("hello");

}

public static void main(String[] args) {

new HelloWorld().displayHelloWorld();

}

}

Page 6: Interfaçage Java et C/C++

2ème étape (1) : Création du fichier de prototypage

1. javac HelloWorld.java

2. javah HelloWorld/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

3.

Page 7: Interfaçage Java et C/C++

2ème étape (2) : L ’argument JNIEnv

Fonction : Interagir avec la JVM

Comportement :

JNIEnv *

Pointeur sur GetFieldIDPointeur sur GetMethodIDPointeur sur FindClass

GetFieldID()

GetMethodID()

FindClass()

Page 8: Interfaçage Java et C/C++

3ème étape : Implémentation du code natif

#include <jni.h>

#include "HelloWorld.h"

#include <stdio.h>

JNIEXPORT void JNICALL

Java_HelloWorld_displayHelloWorld(

JNIEnv *env, jobject obj)

{

printf("Hello world!\n");

return;

}

Page 9: Interfaçage Java et C/C++

4ème étape : Compilation et Exécution

Compiler le code C (exemple sous Linux) :$ gcc -shared -I ./java/include \

–I ./java/include/linux HelloWorldImp.c -o libhello.so

Génère une librairie dynamique

Exécution du programme :

$ java HelloWorld Appel de la méthode native par :

System.loadLibrary("hello");

Page 10: Interfaçage Java et C/C++

Les types primitifs de la JNI

Java Type Native Type Size in bitsBoolean Jboolean 8, unsignedByte Jbyte 8Char Jchar 16, unsignedShort Jshort 16Int Jint 32Long Jlong 64Float Jfloat 32Double Jdouble 64Void Void n/a

Accès direct aux primitives Java

Passage des données de type primitif par valeur

Page 11: Interfaçage Java et C/C++

II. Les possibilités de la JNI

Passer des tableaux ou des chaînes de caractères

Interfacer un objet Java

Gérer des exceptions Java

Page 12: Interfaçage Java et C/C++

Passage d ’un objet Java (1 - Code Java)

class MyJavaClass { public int aValue; public void divByTwo() { aValue /= 2; }

}

public class UseObjects { private native void changeObject(MyJavaClass obj);

static { System.loadLibrary("UseObjImpl"); }

public static void main(String[] args) { UseObjects app = new UseObjects(); MyJavaClass anObj = new MyJavaClass(); anObj.aValue = 2; app.changeObject(anObj); System.out.println("Java: " + anObj.aValue); }

}

Page 13: Interfaçage Java et C/C++

Passage d ’un objet Java (2 - Code natif)

#include <jni.h>

extern "C" JNIEXPORT void JNICALL Java_UseObjects_changeObject( JNIEnv* env, jobject,jobject

obj) { jclass clas = env->GetObjectClass(obj); jfieldID fid = env->GetFieldID(clas, "aValue", "I"); jmethodID mid = env->GetMethodID(clas, "divByTwo", "()V");

int value = env->GetIntField(obj, fid);

printf("Native: %d\n", value); env->SetIntField(obj, fid, 6); env->CallVoidMethod(obj, mid); value = env->GetIntField(obj, fid); printf("Native: %d\n", value);}

Page 14: Interfaçage Java et C/C++

Signatures des types de la JVM

Signature Type le langage Java

Z boolean

B byte

C char

S short

I int

J long

F float

D double

Page 15: Interfaçage Java et C/C++

III. Limites de la JNI

Perte de portabilité Compilation Rattachement à un système

Problèmes d’efficacité Passages d ’information de la JNI vers la JVM

Faille de sécurité Accès aux ressources systèmes

Page 16: Interfaçage Java et C/C++

Efficacité : graphe comparatif

Code C

Code Java

C & Java

+rapide

- rapide

Page 17: Interfaçage Java et C/C++

Bilan d’étude

Des améliorations ont vu le jour entre 1.0, 1.1 et 1.2

Solution à considérer en dernier recours

Possibilités de la version Java 1.4 suppression de la pile liée au code natif accès directe aux classes / méthodes C++

Page 18: Interfaçage Java et C/C++

Bibliographie

Ressources JNI http://java.sun.com/docs/books/tutorial/native1.1 http://developer.java.sun.com/developer/ http://penserenjava.free.fr/pens/indexMain_18&00.htm http://www.javaworld.com/jw-10-1998/jw-10-apptowin32.html

#resources

Tests d ’efficacité http://www.hyperactiveinc.com/tips.asp?tech=Java http://www.str.com.au/jnibench/