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 :

JNA ou meme JNI peu importe


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Par défaut JNA ou meme JNI peu importe
    Bonjour, je voulais savoir si il etait possible de creer une classe/fonction Java qui puisse etre utilisable/appellee par un programme C/C++ et non l'inverse comme il est bien souvent explique sur les sites dedies a JNI/JNA.
    En gros Excecuter du code Java en C.
    si oui, pourriez vous m'eclairer sur la methode a suivre.
    Merci

    Benco

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    http://www.javaworld.com/javaworld/j...javatip17.html

    Gros tuto sur JNI, dont une partie qui décrit la façon de procéder pour appeler du code java depuis du code c++ (et donc par extension depuis du code c)

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Par défaut
    Merci pour le lien,
    le probleme c'est que je n'ai jamais fait de JNI, et je trouve l'exemple un peu complique. ce que je voudrais faire est tres simple a partir d'un programme c++
    appeler une fonction java avec des arguments et que cette fonction retourne une valeur (int, bool).
    j'ai trouve un exemple plus simple a l'adresse http://www.iut-orsay.fr/dptinfo/Peda...a/javaJni.html, j'arrive a compiler creer la DLL mais je n'arrive pas a utiliser la fonction de la DLL :
    l'exemple que j'ai repris est la partie "Utilisation de champs ou méthodes d'un objet".
    j'ai un probleme lors de l'utilisation de la methode, je n'arrive pas a creer la machine virtuelle avec la fonction JNI_CreateJavaVM

    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
     
    JavaVM * jvm;
        JNIEnv *env;
        JavaVMInitArgs vm_args;
     
     
     
    	JavaVMOption options[4];
        JNI_GetDefaultJavaVMInitArgs(&vm_args);
     
    	options[0].optionString = "-Djava.compiler=NONE";
    	options[1].optionString = "-Djava.class.path=C:\Java_workspace\test\src";
    	options[2].optionString = "-Djava.class.path=C:\Java_workspace\test\src";
        options[3].optionString = "-verbose:jni";
     
    	vm_args.version = JNI_VERSION_1_6;
    	vm_args.options = options;
    	vm_args.nOptions =4;
    	vm_args.ignoreUnrecognized = FALSE;//TRUE
     
     
     
        int ret = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
    et avec ce code au niveau de NI_CreateJavaVM jai une erreur memoire qui se cree a l'execution.
    Mise a part cela, n'y aurait-il pas des exemple en JNA(C++ utilisant Java)vu que c'est plus simple.
    Merci
    Ben.

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Par défaut
    J'ai trouve, apparement c'etait un probleme de DLL, il faut mettre la dll jvm.dll du dossier java dans le rep courant du projet et creer la lib a partir de cette dll.
    J'ai maintenant un nouveau probleme, c'est que la fonction JNI_CreateJavaVM me renvoie tout le temps -1.
    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
    JavaVM * jvm;
            JNIEnv *env;  
            JavaVMInitArgs vm_args;
     
    	//memset(&vm_args, 0, sizeof(vm_args));
            JavaVMOption options;
            options.optionString = "-Djava.class.path=C:\\func\\lop";
    	vm_args.version = JNI_VERSION_1_6;
            JNI_GetDefaultJavaVMInitArgs(&vm_args);
     
            vm_args.nOptions = 1;
            vm_args.options = &options;
            vm_args.ignoreUnrecognized = TRUE;
     
            ret = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
    	if(ret < 0)
                    ShowMessage("\nUnable to Launch JVM\n");
            jclass i_cls;
            i_cls = env->FindClass("UtilObj");
            if (i_cls == 0) {
                    ShowMessage("unable to find class");
                    exit(2);
            }
    Quelqun aurait-il une idee?

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En fait il faut laisser la dll jvm.dll à son endroit initial et bien configurer le path d'inclusion des librairies au moment où tu crées ton projet c++.

    Car la dll dépend de toutes les autre librairies java, donc voilà, faut pas y toucher elle est bien où elle est .

    Ainsi que penser au java.library.path

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Par défaut
    Citation Envoyé par sinok Voir le message
    En fait il faut laisser la dll jvm.dll à son endroit initial et bien configurer le path d'inclusion des librairies au moment où tu crées ton projet c++.

    Car la dll dépend de toutes les autre librairies java, donc voilà, faut pas y toucher elle est bien où elle est .

    Ainsi que penser au java.library.path
    Bravos!
    en meme temps c'est logique
    maintenant, j'ai la methode FindClass qui me retourne une valeur null, le chemin est pourtant bon, j'ai meme essaye".-D.java.class.path=." rien y fait!

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Par défaut
    apparemment il y avait une ligne qui n'allait pas dans le fichier java
    System.loadlibrary("Util.h"), j'avais oublie de l'enlever

    sinon j'ai une question (que je repondrai surment par moi meme) :
    est il possible d'appeler une methode java et de recuperer une valueur de retour
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    i_mth = env->GetStaticMethodID(i_cls, "main", "([Ljava/lang/String;)I");
    jint Var = env->CallStaticVoidMethod(i_cls, i_mth);
    ??
    Merci

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

Discussions similaires

  1. [Toutes versions] Fichier vierge qui execute la meme macro peu importe le fichier selectionne
    Par yaya.gaga dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/10/2014, 21h54
  2. Réponses: 1
    Dernier message: 30/06/2008, 13h26
  3. [MySQL] Peu importe la taille du tableau, SQL est censé tout enregistrer(non pas foreach :D )
    Par Dermiste dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/04/2008, 01h47
  4. Réponses: 4
    Dernier message: 28/10/2007, 20h01
  5. [Peu important]JTable effacer colonne
    Par leminipouce dans le forum Composants
    Réponses: 6
    Dernier message: 07/12/2005, 17h30

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