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 et threads


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Par défaut JNI et threads
    Bonjour à tous

    Je suis en train de me familiariser avec JNI en réalisant de petits exemples, et j'ai rencontré un comportement que je n'arrive pas à expliquer.

    Mon exemple est très très simple à comprendre
    Java demande à ma fonction native en C d’écrire "COUCOU".
    A la fin de la sortie de la fonction native, Java écrit "Hello"

    voici le code natif en C

    le .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
    22
     
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class TestJavaCPP */
     
    #ifndef _Included_TestJavaCPP
    #define _Included_TestJavaCPP
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     TestJavaCPP
     * Method:    SayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_TestJavaCPP_SayHello
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    le .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <jni.h>
    #include <stdio.h>
    #include <TestJavaCPP.h>
     
    JNIEXPORT void JNICALL Java_TestJavaCPP_SayHello(JNIEnv *env, jobject obj)
    {
        printf("COUCOU\n");
    }
    et le 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
    27
    28
    29
     
     
    public class TestJavaCPP {
     
    	public static void main(String[] args)
    	{
    		TestJavaCPP HelloRun = new TestJavaCPP();
    		int i = 10; 
    		while(i>0)
    		{
    			HelloRun.SayHello();
    			System.out.println("HELLO");
    			--i;
    		}
    	}
     
    	public TestJavaCPP()
    	{
    		System.out.println("new JAVA TestJavaCPP");
    	}
     
    	public native void SayHello();
     
    	static
    	{
    	    System.loadLibrary("TestJavaCPP");
    	}
     
    }
    le résultat en console est déconcertant puisque j’obtiens :

    new JAVA TestJavaCPP
    HELLO
    HELLO
    HELLO
    HELLO
    HELLO
    HELLO
    HELLO
    HELLO
    HELLO
    HELLO
    COUCOU
    COUCOU
    COUCOU
    COUCOU
    COUCOU
    COUCOU
    COUCOU
    COUCOU
    COUCOU
    COUCOU


    au lieu de:

    new JAVA TestJavaCPP
    COUCOU
    HELLO
    COUCOU
    HELLO
    COUCOU
    HELLO
    COUCOU
    HELLO
    ...

    D'ou provient ce probleme? Est-ce dû au fait que mon processeur est multi-core? Comment contourner ce problème?

    Merci d'avance pour vos réponses !!!

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    En C les données écrites sur la console peuvent être bufférisé et pas réellement écrites sur la console.

    En général ca ne pose pas de problème car comme toutes les écritures passe par le même "tuyau" au final tout est dans le bon sens...

    Là comme tu utilises deux moyens différents lorsque les données sont écrites il y a déjà autre chose...


    Essayes de rajouter un fflush(stdout) dans ton code natif pour voir...


    a++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Par défaut
    Merci beaucoup adiGuba !!

    Effectivement, ça fonctionne bien maintenant !

    Néanmoins, je ne suis pas tout à fait sûr d'avoir compris ce qui s'est passé.
    D'après toi, mes printf étaient bien passés à la console en temps et en heure (donc entre les "HELLO"), mais ils n’étaient juste pas encore affichés.
    C'est bien ça?

    J'ai amélioré mon exemple avec des scanf pour récupérer une saisie et j'ai été confronté au même problème.

    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
     
    #include <jni.h>
    #include <stdio.h>
    #include <TestJavaCPP.h>
     
    JNIEXPORT jstring JNICALL Java_TestJavaCPP_GetAnswer
      (JNIEnv *env, jobject obj, jstring question)
    {
        char buf[128];
        const char *str;
        str = (*env)->GetStringUTFChars(env, question, NULL);
        if (str == NULL)
            return NULL;
     
        printf("%s",str);
        (*env)->ReleaseStringUTFChars(env, question, str);
     
        scanf("%s",buf);
        return (*env)->NewStringUTF(env, buf);
    }
    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
     
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class TestJavaCPP */
     
    #ifndef _Included_TestJavaCPP
    #define _Included_TestJavaCPP
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    /*
     * Class:     TestJavaCPP
     * Method:    GetAnswer
     * Signature: (Ljava/lang/String;)Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_TestJavaCPP_GetAnswer
      (JNIEnv *, jobject, jstring);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    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
     
    public class TestJavaCPP {
     
    	public static void main(String[] args)
    	{
    		TestJavaCPP HelloRun = new TestJavaCPP();
     
    		String name = HelloRun.GetAnswer("quel est ton nom ?");
    		System.out.println("Ton nom est "+name);
    	}
     
    	public TestJavaCPP()
    	{
    		System.out.println("new JAVA TestJavaCPP");
    	}
     
    	public native String GetAnswer(String question);
     
    	static
    	{
    	    System.loadLibrary("TestJavaCPP");
    	}
     
    }
    Le fflush(stdout) a de nouveau réglé mon problème.

    d'où 2 questions :

    Est-ce que je peux en conclure que tout appel à la console doit obligatoirement s'accompagner d'un fflush(stdout)?

    Dans le cas où il n'y a pas de console, est-ce que je peux toujours affirmer que mes appels sont gérés dans l'ordre? (Java -> JNI-> C -> JNI -> Java)

    Merci d'avance

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mat_dev Voir le message
    Est-ce que je peux en conclure que tout appel à la console doit obligatoirement s'accompagner d'un fflush(stdout)?
    Disons que le fflush() te permet de forcer l'envoi des données.
    Sans cela cet envoi dépend de plusieurs critères et les données peuvent rester dans le buffer.

    Comme tu as deux buffer (celui de Java et celui du C), tu ne peux pas déterminer l'ordre d'arrivée. Avec fflush() tu forces l'écriture des données ce qui conservera l'ordre...

    Citation Envoyé par Mat_dev Voir le message
    Dans le cas où il n'y a pas de console, est-ce que je peux toujours affirmer que mes appels sont gérés dans l'ordre? (Java -> JNI-> C -> JNI -> Java)
    Ces problèmes de buffer de la console n'ont aucun impact sur l'ordre d'exécution...


    a++

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Par défaut
    Merci adiGuba !!

    OK pour les réponses. C'est bien clair maintenant. Espérons que ce topic en aidera d'autres

    Je passe le topic en résolu.

    a+

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

Discussions similaires

  1. Code JNI et thread Java
    Par grunk dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 23/02/2015, 17h06
  2. [JNI] Problème de threads
    Par romainromain dans le forum C
    Réponses: 0
    Dernier message: 03/08/2009, 10h06
  3. Threads et JNI
    Par cereal dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/06/2007, 12h45
  4. [JNI] Problème dû aux threads Java
    Par seiryujay dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/11/2006, 13h14
  5. [JNI] Class Thread et Synchronisation
    Par SteelBox dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/02/2006, 23h40

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