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 :

Passage d'un argument en entrée/sortie avec JNI


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut Passage d'un argument en entrée/sortie avec JNI
    Bonjour,

    Je fais mes premiers pas avec JNI et j'ai donc utilisé le tutoriel de JM Doudoux.
    J'ai donc implémenté la méthode ajouter, seulement, je souhaiterai passer le résultat en entrée/sortie.
    Tout compile bien sauf que mon addition ne se fait pas

    Je vous joins mes différents code ainsi que mes résultats à la console. J'ai besoin de passer des paramètres en entrée/sortie (retourner plusieurs valeurs) pour une implémentation sur des méthodes plus sophistiquées. j'ai donc voulu commencer par tester sur un exemple simple...

    J'utilise NetBeans 6.9 et JDK 1.6.0_20

    Merci pour votre aide !


    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package testjni1;
     
    public class TestJNI1 {
     
        public native void ajouter(int a,int b,int c);
        static {
          System.load("mabibjni.dll");
        }
     
        public static void main(String[] args) {
            TestJNI1 maclasse = new TestJNI1();
            int a,b,c;
            a=3;
            b=2;
            c=0;
            System.out.println("a = " + a);
            System.out.println("b = " + b);
            maclasse.ajouter(a,b,c);
            System.out.println("from C Code a+b = c = " + c);
            c=a+b;
            System.out.println("from Java Code a+b = c = " + c);
     
        }
     
    }

    Ma librairie dynamique C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <jni.h>
     
    #include <stdio.h>
     
    #include "TestJNI1.h"
     
     
    JNIEXPORT void JNICALL Java_testjni1_TestJNI1_ajouter
    (JNIEnv *env, jobject obj, jint a, jint b, jint c)
    {
      c = a + b;
    }
    Mes résultats à la console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    run:
    a = 3
    b = 2
    from C Code a+b = c = 0
    from Java Code a+b = c = 5
    GÉNÉRATION TERMINÉE (durée totale* 0 secondes)

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut
    Petite précision

    En ajoutant à ma librairie dynamique C la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("from C code c = %d\n",c);
    J'obtiens en console :
    donc l'addition se fait bien, c'est la passage du paramètre qui ne se fait pas et/ou se fait mal...

    Quelqu'un pour m'aider ???

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    La réponse se trouve dans le tutorial de JM Doudoux que tu as mis dans ton premier post ce qui donne donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <jni.h>
     
    #include <stdio.h>
     
    #include "TestJNI1.h"
     
     
    JNIEXPORT jint JNICALL Java_testjni1_TestJNI1_ajouter
    (JNIEnv *env, jobject obj, jint a, jint b)
    {
      return a + b;
    }
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut
    Ca n'est pas possible de le passer en argument ???
    Par exemple, si je veux aussi retourner d=a*b par cette même fonction...
    Si je comprends bien, il faut faire une fonction par valeur retournée ?

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    il ne faut surtout pas oublier que au dessus tu as du java. tes paramètres sont passé par copie.
    En java si tu appel une méthode en lui passant un int et que cet int est modifié dans la méthode, au retour de celle-ci ton int aura toujours la valeur d'origine.

    si tu veux pouvoir modifier des paramètres il faut que ceux ci se trouve dans un objet ou plus précisément dans un jobject (dans le code JNI).

    Tu va perdre vraiment beaucoup de temps avec JNI (vu que tu ne le connais pas) et que tu es limité dans le temps pour ton projet.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut
    Merci pour ces précisions !
    Auriez vous un exemple de code de manipulation de ces jobjects, par le plus grand des hasards ?

    Merci pour tout dans tous les cas !

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Comme tu va le voir, avec JNI ce qui est simple en java devient long et compliqué a écrire.
    Imaginons que tu souhaites parcourir une liste d'int en java tu écrira :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (Iterator iterator = lst.iterator(); iterator.hasNext();) {
    	int monInt= (Integer) iterator.next();
    	// ...
    }
    en imaginant que tu n'utilise pas l'autoboxing ce sera plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (Iterator iterator = lst.iterator(); iterator.hasNext();) {
    	Integer object = (Integer) iterator.next();
    	int monInt = object.intValue();
    	// ...
    }
    Mais en JNI ca va ressembler plutôt à ca :
    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
     
        jclass clsArrayList = env->FindClass("java/util/ArrayList");
        jmethodID midArrayListSize = 0;
        jmethodID midArrayListGet = 0;
        if(clsArrayList != 0){
            midArrayListSize = env->GetMethodID( clsArrayList, "size", "()I");
            midArrayListGet = env->GetMethodID(clsArrayList, "get", "(I)Ljava/lang/Object;");
            jclass clsInteger = env->FindClass("java/lang/Integer");
            jmethodID midIntegerIntValue = 0;
            if(clsInteger != 0){
                midIntegerIntValue = env->GetMethodID(clsInteger, "intValue", "()I");
                int arrayListSize = env->CallIntMethod(alParam,  midArrayListSize );
                if((arrayListSize > 0)&& (midArrayListGet != 0) && (midIntegerIntValue != 0)){     
                    for(int i=0; i<arrayListSize; i++){
                        jobject arrayElement = env->CallObjectMethod(alParam,  midArrayListGet, i);
                        int intValue = env->CallIntMethod(arrayElement,  midIntegerIntValue);                   
                        //...
                    }
                    //...       
                }
     
            }     
        }
    Faire juste un calcule avec des ints c'est facile mais la manipulation des Object devient vite compliqué.
    En fait, cela revient à faire du code comme si tu écrivais du code java en faisant de la réflexion.
    C'est pour cette raison que je t'ai dit que tu risquais de perdre beaucoup de temps avec JNI.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut Merci !
    En fait j'ai simplement réécrit les fonctions PI dont j'avais besoin en C++ que j'ai encapsulé via JNI, ça fonctionne nickel, et c'est rapide...
    J'ai effectué des conversions de type pour ne renvoyer qu'une seule valeur.
    Je te remercie pour ton aide et effectivement ça ne me donne pas envie de me lancer dans les objects via JNI, je me servirai des objets directement sous Java
    Bonne fin de journée et encore merci !

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

Discussions similaires

  1. problèmes de entrée/sortie avec Qemu
    Par CodeurNé dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 11/05/2011, 16h48
  2. Flux entrée sortie avec Struts
    Par stef_ich dans le forum Struts 1
    Réponses: 0
    Dernier message: 10/04/2010, 14h57
  3. Réponses: 13
    Dernier message: 24/03/2007, 17h12
  4. Réponses: 1
    Dernier message: 11/01/2007, 09h00
  5. [Débutant]Procédure avec paramètres entrée / sortie
    Par jeromejanson dans le forum Langage
    Réponses: 13
    Dernier message: 10/10/2005, 08h30

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