IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Petit problème avec la JNI


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 78
    Par défaut Petit problème avec la JNI
    Bonjour, j'ai un problème quant à la récupération des données d'un objet java passé en paramètre à une methode c++. J'ai réalisé ce petit exemple pour que ce soit plus clair :
    Voici mes classes java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package test;
     
    public class TestJNI {
     
     
    	// Librairy c++
    	static {System.loadLibrary("maLibrary");}	// Déclaration de la library dynamique
    	public native void goCpp(double unDouble, MonObjet obj);
     
    	// Attribut
    	private double doubleTemoin;
    	private MonObjet monObjet;
     
    	public TestJNI(double doubleTemoin, MonObjet monObjet) {
    		super();
    		this.doubleTemoin = doubleTemoin;
    		this.monObjet = monObjet;
    	}
     
    	public void appelAuCpp () {
    		System.out.println("Appel au c++");
    		goCpp (doubleTemoin, monObjet);		
    		System.out.println("Fin appel");
    	}
     
    }//end of class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package test;
     
    public class MonObjet {
     
    	double monAutreDouble;
     
    	public MonObjet(double monAutreDouble) {
    		super();
    		this.monAutreDouble = monAutreDouble;
    	}
     
    	public double getMonAutreDouble() {
    		return monAutreDouble;
    	}
     
    	public void setMonAutreDouble(double monAutreDouble) {
    		this.monAutreDouble = monAutreDouble;
    	}	
     
    }//end of class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package test;
     
    public class MonTest {
     
    	public static void main(String[] args) {
     
    		TestJNI t = new TestJNI (2.1, new MonObjet (2.2));
    		t.appelAuCpp ();
     
    	}
     
    }//end of class
    Et voici mon fichier .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include "test_TestJNI.h" 
    #include <iostream>
    #include <jni.h>
     
    using namespace std;
     
    JNIEXPORT void JNICALL Java_test_TestJNI_goCpp (JNIEnv *env, jobject t, jdouble d, jobject mo) {
     
    	jclass monObjet, testJNI;
    	jfieldID fid;
     
    	jdouble monAutreDouble, doubleTemoin;
     
    	monObjet = env -> GetObjectClass(mo);
    	testJNI = env -> GetObjectClass(t);	  
     
    	cout << "---- <C++> ----" << endl;
     
    	 cout << "Le double passé en paramètre = " << d << endl;
     
    	fid = env -> GetFieldID(testJNI,"doubleTemoin", "D");
    	doubleTemoin = env -> GetDoubleField(testJNI, fid);
     
    	fid = env -> GetFieldID(monObjet,"monAutreDouble", "D");
    	monAutreDouble = env -> GetDoubleField(monObjet, fid);
     
    	cout << "Ce même double récupéré directement dans la classe = " << doubleTemoin << endl;	
     
    	cout << "L'autre d'ouble récupéré dans l'objet MonObjet = " << monAutreDouble << endl;
     
    	cout << "---- </C++> ----" << endl;  	
     
    }//end of method
    ainsi que sont .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class test_TestJNI */
     
    #ifndef _Included_test_TestJNI
    #define _Included_test_TestJNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     test_TestJNI
     * Method:    goCpp
     * Signature: (DLtest/MonObjet;)V
     */
    JNIEXPORT void JNICALL Java_test_TestJNI_goCpp
      (JNIEnv *, jobject, jdouble, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    Et voici le résultat que j'obtiens :
    Appel au c++
    ---- <C++> ----
    Le double passé en paramètre = 2.1
    Ce même double récupéré directement dans la classe = 0
    L'autre d'ouble récupéré dans l'objet MonObjet = 1.16741e-314
    ---- </C++> ----
    Fin appel
    Quand je passe le double en paramêtre, tout fonctionne correctement. En revanche dès que j'essaie d'aller le chercher dans un objet java, j'obtiens une valeur abérrante.
    Qqun saurait-il où se situe mon erreur ?

    Merci d'avance

    PS : je suis sous linux (ubuntu edgy), et voici la ligne que j'utilise pour compiler la library :
    g++ -o libmaLibrary.so -fPIC -shared -I /usr/lib/jvm/java-6-sun-1.6.0.00/include/ -I /usr/lib/jvm/java-6-sun-1.6.0.00/include/linux/ maLibrary.cpp

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 78
    Par défaut
    Petit up :/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 78
    Par défaut
    C'est bon, j'ai trouvé d'où ça venait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include "test_TestJNI.h" 
    #include <iostream>
    #include <jni.h>
     
    using namespace std;
     
    JNIEXPORT void JNICALL Java_test_TestJNI_goCpp (JNIEnv *env, jobject t, jdouble d, jobject mo) {
     
    	jclass monObjet, testJNI;
    	jfieldID fid;
    	jmethodID mid;
     
    	jdouble monAutreDouble, doubleTemoin;
     
    	cout << "---- <C++> ----" << endl;
     
    	 cout << "Le double passé en paramètre = " << d << endl;
     
     
     
    	fid = env -> GetFieldID(testJNI,"doubleTemoin", "D");
    	doubleTemoin = env -> GetDoubleField(t, fid);
     
     
    	fid = env->GetFieldID(monObjet,"monAutreDouble", "D");
    	monAutreDouble =env-> GetDoubleField(mo, fid);
     
    	cout << "Ce même double récupéré directement dans la classe = " << doubleTemoin << endl;	
     
    	cout << "L'autre d'ouble récupéré dans l'objet MonObjet = " << monAutreDouble << endl;
     
    	cout << "---- </C++> ----" << endl;  	
     
    }//end of method
    en fait, pas besoin des lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	monObjet = env-> GetObjectClass(mo);
    	testJNI = env -> GetObjectClass(t);
    il suffit simplement d'utiliser les jobject passés en paramètres.

  4. #4
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Par défaut
    Salut,

    je ne vois pas d'erreur (mais je ne suis pas un pro de la JNI).

    Je vais essayer ton code, j'éssai moi aussi de comprendre le fonctionnement de la JNI. si je trouve ...

  5. #5
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Par défaut
    Citation Envoyé par cereal
    C'est bon, j'ai trouvé d'où ça venait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include "test_TestJNI.h" 
    #include <iostream>
    #include <jni.h>
     
    using namespace std;
     
    JNIEXPORT void JNICALL Java_test_TestJNI_goCpp (JNIEnv *env, jobject t, jdouble d, jobject mo) {
     
    	jclass monObjet, testJNI;
    	jfieldID fid;
    	jmethodID mid;
     
    	jdouble monAutreDouble, doubleTemoin;
     
    	cout << "---- <C++> ----" << endl;
     
    	 cout << "Le double passé en paramètre = " << d << endl;
     
     
     
    	fid = env -> GetFieldID(testJNI,"doubleTemoin", "D");
    	doubleTemoin = env -> GetDoubleField(t, fid);
     
     
    	fid = env->GetFieldID(monObjet,"monAutreDouble", "D");
    	monAutreDouble =env-> GetDoubleField(mo, fid);
     
    	cout << "Ce même double récupéré directement dans la classe = " << doubleTemoin << endl;	
     
    	cout << "L'autre d'ouble récupéré dans l'objet MonObjet = " << monAutreDouble << endl;
     
    	cout << "---- </C++> ----" << endl;  	
     
    }//end of method
    en fait, pas besoin des lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	monObjet = env-> GetObjectClass(mo);
    	testJNI = env -> GetObjectClass(t);
    il suffit simplement d'utiliser les jobject passés en paramètres.


    Et dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fid = env -> GetFieldID(testJNI,"doubleTemoin", "D");
    si ton testJNI n'a pas été défini comment sait il de quelle classe il s'agit ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 78
    Par défaut
    Au temps pour moi, voilà le code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include "test_TestJNI.h" 
    #include <iostream>
    #include <jni.h>
     
    using namespace std;
     
    JNIEXPORT void JNICALL Java_test_TestJNI_goCpp (JNIEnv *env, jobject t, jdouble d, jobject mo) {
     
    	jclass monObjet, testJNI;
    	jfieldID fid;
    	jmethodID mid;
     
    	jdouble monAutreDouble, doubleTemoin;
     
    	monObjet = env-> GetObjectClass(mo);
    	testJNI = env -> GetObjectClass(t);	  
     
    	cout << "---- <C++> ----" << endl;
     
    	 cout << "Le double passé en paramètre = " << d << endl;
     
     
     
    	fid = env -> GetFieldID(testJNI,"doubleTemoin", "D");
    	doubleTemoin = env -> GetDoubleField(t, fid);
     
     
    	fid = env->GetFieldID(monObjet,"monAutreDouble", "D");
    	monAutreDouble =env-> GetDoubleField(mo, fid);
     
    	cout << "Ce même double récupéré directement dans la classe = " << doubleTemoin << endl;	
     
    	cout << "L'autre d'ouble récupéré dans l'objet MonObjet = " << monAutreDouble << endl;
     
    	cout << "---- </C++> ----" << endl;  	
     
    }//end of method
    En gros, faut recupérer l'identifiant du champ sur la "classe" et le champ lui-même sur l'objet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petits problèmes avec une CListCtrl
    Par vanitom dans le forum MFC
    Réponses: 2
    Dernier message: 17/11/2005, 11h45
  2. Un petit problème avec pop
    Par Paulinho dans le forum C++
    Réponses: 4
    Dernier message: 13/11/2005, 20h57
  3. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo