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] Remontée d'évenements DLL C++ vers Java


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut [JNI] Remontée d'évenements DLL C++ vers Java
    Bonjour

    J'utilise JNI pour dialoguer avec une DLL developpée en C++.

    L'appel de fonctions C++ à partir de l'appli Java fonctionne.

    Maintenant , je voudrais appeler une fonction JAVA depuis mons code C++ sur réception d'un evènement externe.

    Est-ce possible ?

    Ou est-ce que le doit appeler , a partir de Java ,une fonction de la DLL C++ qui ne retourne que sur réception de l'évenement externe ?

    Merci bcp.

  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 : 42
    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
    Par défaut
    Il est tout à fait possible d'appeler une méthode Java depuis le code natif.

    Et plus généralement : Les spécifications de JNI.
    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 :resolu:

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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    Merci beaucoup

    J'avais déjà du voir cette doc mais sans trop comprendre
    car il n'y a aucun exemple .

    Je vais tenter de mettre ce mécanisme en place .

  4. #4
    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 : 42
    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
    Par défaut
    Voici un petit exemple (en C) qui appel la méthode statique Java System.currentTimeMillis().

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Récupération de la classe
    jclass clazz = (*env)->FindClass(env, "java/lang/System");
     
    // Récupération de l'identifiant de la méthode statique
    jmethodID methodId = (*env)->GetStaticMethodID(env, clazz, "currentTimeMillis", "()J");
     
    // Appel de la méthode statique
    jlong time = (*env)->CallStaticLongMethod(env, clazz, methodId);
    Remarque : je n'ai pas fait la gestion des erreurs.

    Pour la signature des méthodes cf Type Signatures.

    [EDIT] Correction d'erreurs dans le code [/EDIT]
    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 :resolu:

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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    Merci bcp

    Mais comment récupère t-on (ou connait-on) la variable env (JNIEnv* sans doute) ?

    Donc coté appli Java , il n'y aurait qu'a déclarer une méthode de classe (comme d'habitude ) ?

  6. #6
    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 : 42
    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
    Par défaut
    Jette un coup d'oeil à Penser en Java : L'Interface Java Natif (JNI), tu y trouveras tout ce qu'il faut pour s'initier à JNI .
    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 :resolu:

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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    J'ai relu la doc mais ça me dit pas si je peux déclarer une fonction d'init Java -vers C++ qui permet de stocker dans la DLL C++ le pointeur sur env et éventuellement l'instance de l'objet java pour l'utiliser par la suite.

  8. #8
    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 : 42
    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
    Par défaut
    Je ne sais pas, je n'ai jamais essayé.
    As-tu essayé ?
    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 :resolu:

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

  9. #9
    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 : 42
    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
    Par défaut
    Bon, je viens de tester et apparemment ça marche

    Test.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
    public class Test {
     
        static {
            System.loadLibrary("test");
        }
     
        public static native void foo();
        private native void init();
     
        public static void main(String ...args) {
            Test.foo();
            Test test = new Test();
            test.init();
            Test.foo();
        }
    }
    test.h
    Code C : 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
    #include <jni.h>
    /* Header for class Test */
     
    #ifndef _Included_Test
    #define _Included_Test
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    void testInit(void);
     
    /*
     * Class:     Test
     * Method:    foo
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_Test_foo
      (JNIEnv *, jclass);
     
    /*
     * Class:     Test
     * Method:    init
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_Test_init
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    test.c
    Code C : 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
    #include <jni.h>
    #include <stdio.h>
    #include "test.h"
     
    static JNIEnv *staticEnv = NULL;
    static jobject staticObj = NULL;
     
    void testInit(void) {
        if(staticEnv == NULL) {
            printf("JNIEnv is NOT initialized\n");
        } else {
            printf("JNIEnv is initialized\n");
        }
        if(staticObj == NULL) {
            printf("jobject is NOT initialized\n");
        } else {
            printf("jobject is initialized\n");
        }
    }
     
    JNIEXPORT void JNICALL Java_Test_init(JNIEnv *env, jobject obj) {
        staticEnv = env;
        staticObj = obj;
    }
     
    JNIEXPORT void JNICALL Java_Test_foo(JNIEnv *env, jclass clazz) {
        testInit();
    }
    Et j'obtiens bien la sortie :
    JNIEnv is NOT initialized
    jobject is NOT initialized
    JNIEnv is initialized
    jobject is initialized
    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 :resolu:

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

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    Je n'avais pas eu le temps de tester !
    Merci beaucoup ,
    Je vais lire et relire la spec jni

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    Je pense que ce test n'est pas bon.

    Les variables staticEnv et staticObj
    sont bien différentes de NULL mais plus valides.

    J'ai fais un test et si je les utilisent avant le retour de la fonction ,
    c'est ok mais après ça plante.

  12. #12
    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 : 42
    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
    Par défaut
    Je ne sais pas si tu as utilisé mon code pour l'appel à System.currentTimeMillis() mais si c'est le cas il y avait des erreurs que je viens de corriger (j'ai modifier le post). Par contre ses erreurs ne passaient pas la compilation, maintenant ça marche.

    Sinon précise le "ça plante" (message d'erreur ?) avec aussi le code incriminé.
    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 :resolu:

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

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    Je parle de l'exemple ou tu stockes les paramètres
    JNIEnv *staticEnv et jobject staticObj
    pour le utiliser ultérieurement.

    Si tu les utilises dans ta fonction Java_Test_foo
    (et pas seulement voir s'ils sont non null) ,
    il y a pb.

    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
     
    void OnEventExterne()
    {
    if((staticEnv != NULL) && (staticObj != NULL))
       {
    		try
    		{
    			jclass cls = staticEnv->GetObjectClass(staticObj);	
    			jmethodID mid = staticEnv->GetMethodID(cls, "OnEvent", "()V");
    			staticEnv->CallVoidMethod(staticObj, mid);
    		}
     
    		catch(...)
    		{
    			MessageBox(NULL,"!!!","Erreur event",MB_OK);
    		}
       }

  14. #14
    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 : 42
    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
    Par défaut
    Si tu n'affiches pas l'exception ce sera difficile de savoir d'où vient le problème ^^.
    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 :resolu:

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

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    JNIEnv est propre au thread donc si tu appelles la méthode init depuis un thread différent que celui qui lance l'évennement ça ne marchera pas.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2009, 18h25
  2. [JNI]appel d'un dll en Java
    Par Aida dans le forum Entrée/Sortie
    Réponses: 22
    Dernier message: 23/01/2008, 16h19
  3. Remontée des évenements des fils vers les parents
    Par carodon2002 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 03/05/2007, 13h52
  4. [Windows]utiliser une dll c# en java
    Par dude666 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 01/07/2005, 02h19
  5. [Conversion]Applet Java Vers Java Web Start
    Par robin206 dans le forum JWS
    Réponses: 2
    Dernier message: 20/04/2005, 09h28

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