2012-02-17 2 views
1

J'ai le code suivant dans un très simple exemple JNI (Java + C)séquence de pile JNI malentendu

Java

package jnitest; 


public class JNITest { 

    static { 
    System.load("C:/.../JNItestNative.dll"); 
    } 

    public native void hello(); 

    public static void main(String[] args) { 
    JNITest jniTest = new JNITest(); 

    System.out.println("Hello in java"); 
    jniTest.hello(); 
    System.out.println("Bye in java"); 
    } 
} 

C

/* 
* File: jnitestnative.c 
* Author: DEFAULT 
* 
* Created on February 17, 2012, 12:24 PM 
*/ 

#include <jni.h> 
#include <stdio.h> 
#include <stdlib.h> 

/* 
* 
*/ 
JNIEXPORT void JNICALL Java_jnitest_JNITest_hello 
    (JNIEnv *env, jobject obj) { 

    printf("Hello in C\n"); 
    printf("Bye in C\n"); 

    return; 
} 

Je pense que le résultat à être comme ceci:

Hello in Java 
Hello in C 
Bye in C 
Bye in Java 

Mais il est vraiment comme ça:

Hello in java 
Bye in java 
Hello in C 
Bye in C 
+1

Peut-être que 'tampons System.out.println' quelque part différents que' printf'? Essayez d'écrire sur autre chose (comme un fichier)? –

+0

A l'origine, je faisais face à ce problème quand je changeais la taille d'un caractère passé [] non seulement en écho à la console! – ehsun7b

+0

@JamesMcLaughlin Vous avez raison, le résultat dans un fichier texte est comme prévu, mais pouvons-nous avoir un tel problème lorsque nous manipulons les objets Java en C ??? – ehsun7b

Répondre

1

Quand je lance le code affiché j'obtenir le résultat attendu. Il peut y avoir une mise en mémoire tampon étrange due au fait que stdout est tamponnée par la bibliothèque C standard, tandis que la JVM a tendance à contourner la bibliothèque C et à utiliser directement les appels OS.

Si tel est le cas, vous pouvez toujours rincer stdout avant de revenir de C:

printf("Hello in C\n"); 
printf("Bye in C\n"); 
fflush(stdout); 
return; 
+0

Ceci est la première chose à laquelle je pense aussi, mais ne fait pas newline pour que 'printf' vider le contenu dans' stdout'? –

+0

En théorie, oui. Mais ça ne fera pas de mal de vérifier si un fflush explicite ne fait vraiment aucune différence. –

+0

Uniquement lorsque stdout est mis en mémoire tampon. C'est généralement le cas mais apparemment il y a des cas où ce n'est pas le cas. – Joni