Interfaçage Java et C/C++

Post on 06-Jan-2016

20 views 0 download

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

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 Manipulation des Strings, des tableaux, objets Java, etc...

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

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

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

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();

}

}

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.

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

Fonction : Interagir avec la JVM

Comportement :

JNIEnv *

Pointeur sur GetFieldIDPointeur sur GetMethodIDPointeur sur FindClass

GetFieldID()

GetMethodID()

FindClass()

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;

}

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");

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

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

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); }

}

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);}

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

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

Efficacité : graphe comparatif

Code C

Code Java

C & Java

+rapide

- rapide

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

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/