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 :

[JNI] appel d'une méthode java depuis le code natif


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut [JNI] appel d'une méthode java depuis le code natif
    Bonjour,

    Encore une question du boulet qui capte rien au JNI... et pourtant c'est pas faute de chercher !

    Bon alors voila, je veux simplement executer des méthodes d'une classe java depuis du C. D'après les exemples trouvés sur internet, çà à pas l'air bien méchant, seul problème, çà marche pô !

    Extrait de ma classe java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class CLIST_S{
     
    	void afficher(){
    		int size = liste.size();
    		System.out.println("Taille de la liste = " + size);
    		Iterator<String> it = liste.iterator();
    		while(it.hasNext()){
    			System.out.print("'" + it.next() + "' ");
    		}
    		System.out.print("\n");
    	}
    }
    Extrait du code natif en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    JNIEXPORT void JNICALL Java_Main_native_1methode(JNIEnv * env, jobject obj, jobjectArray l){
     
    jclass cls = (*env)->GetObjectClass(env,obj);
    jmethodID mid = (*env)->GetMethodID(env,cls, "afficher", "()V");
    (*env)->CallVoidMethod(env,obj, mid);
    }
    Et donc, çà compile et çà plante à l'execution -> "EXCEPTION_ACCESS_VIOLATION" et tout le tralala...
    Je comprends pas, çà ressemble enormément aux exemples du livre sur le jni que j'ai téléchargé sur le site de sun...

    Merci d'avance de votre aide.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Est-ce que ta méthode native se trouve bien dans la même classe que la méthode java que tu appel depuis JNI ?
    En effet, la ligne
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    jclass cls = (*env)->GetObjectClass(env, obj);
    renvoie la classe de l'objet auquel appartient la méthode native appelée.
    Donc quand tu écris le code
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jmethodID mid = (*env)->GetMethodID(env,cls, "afficher", "()V");
    (*env)->CallVoidMethod(env,obj, mid);
    tu demandes à récupérer la méthode afficher() de cette classe puis tu l'exécutes sur l'objet en question.
    Si cet objet n'est pas une instance de la classe possédant la méthode afficher() (dans ton cas il s'agit de ta classe CLIST_S) alors cela ne marche pas.

    Pense à toujours vérifier la non nullité du retour des méthodes du genre GetObjectClass, FindClass, GetMethodID, GetFieldID, etc.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    jclass cls = (*env)->GetObjectClass(env, obj);
    if(cls == NULL) {
        printf("ERROR : object class not found\n");
        return;
    }
    jmethodID mid = (*env)->GetMethodID(env, cls, "afficher", "()V");
    if(mid == NULL) {
        printf("ERROR : method ID not found\n");
        return;
    }
    (*env)->CallVoidMethod(env, obj, mid);
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Eh, franchement, MERCI !

    y@m's t'es vraiment sympa et efficace en plus !

    Merci encore

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Problème de compréhension
    Bonjour à vous deux, je m'excuse à l'avance de poser une telle question, mais...

    De quelle manière appelles-tu le code que tu as écris dans ta Jni ?

    Est-ce du code que tu appelles dans Java, en important le fichier dans lequel tu as la classe CLIST_S, ?

    Ou bien...

    Est-ce du code que tu appelles à partir d'un programme C++ (ou C), en incluant le fichier .H de ta Jni et en l'utilisant par exemple dans un main ?

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

Discussions similaires

  1. Appeler une méthode Java depuis javascript
    Par zied_21 dans le forum Langage
    Réponses: 4
    Dernier message: 18/03/2011, 17h58
  2. Appeler systématiquement une méthode JAVA
    Par soucine dans le forum JSF
    Réponses: 6
    Dernier message: 17/08/2009, 17h56
  3. Réponses: 6
    Dernier message: 24/03/2009, 16h17
  4. Appel d'une méthode java par le biais d'un lien
    Par Lex92 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 02/07/2008, 13h17
  5. Appel d'une méthode C++ depuis un code C
    Par fantomchris dans le forum MFC
    Réponses: 3
    Dernier message: 02/05/2008, 12h52

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