2014-04-15 11 views
7

Piszę program, który używa JNI do interfejsu z prostym programem c. I zostały utworzone następujące programy:JNI system.out i zachowanie printf

public static void main(String[] args) { 
    Hello h = new Hello(); 
    System.out.println("before"); 
    int number = h.sayHello(); 
    System.out.println(number); 
    System.out.println("after"); 
} 

i

JNIEXPORT int JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { 
    printf("Hello JNI\n"); 
    return 10; 
} 

ku mojemu zdziwieniu ten program zwróci:

before 
10 
after 
Hello JNI 

Dla mnie jest to bardzo dziwne, ponieważ oczywiste jest, że program c jest wykonywane między instrukcją "przed" i "po" (drukowana jest liczba 10). Ale dlaczego instrukcja printf nie jest wykonywana, gdy zostanie wywołana. Czy jest w jakiś sposób zablokowany przez jvm, ponieważ tylko jeden program może zapisywać na wyjściu w tym samym czasie? Czy istnieje sposób na naprawienie tego zachowania?

Odpowiedz

14

Tak. Będziesz musiał zadzwonić pod numer flush.

W C, czyli fflush wezwanie -

printf("Hello JNI\n"); 
fflush(stdout); 
return 10; 

W Java, że jest po prostu flush na Stream -

System.out.println("before"); 
System.out.flush();