2012-04-28 10 views
6

Ich habe kürzlich mit JNI experimentiert, um einige existierende C++ - Bibliotheken zu portieren.JNI-Aufrufe verschachtelt mit regulären Java-Aufrufe - was ist die Reihenfolge der Ausführung?

Als Teil meiner Tests habe ich ein einfaches Helloworld-Programm erstellt. Ich rufe eine einfache native Funktion in C++ auf, die nur Nachrichten ausgibt. Ich bin etwas neugierig auf etwas Verhalten, das ich während der Ausführung des Programms beobachtet habe - es scheint, dass alle nativen Funktionsnachrichten/Antworten nach Java gedruckt werden. Liegt das daran, dass native Aufrufe nach Java-Aufrufen ausgeführt werden, oder soll ich dieses Verhalten einfach ignorieren?

public static void main(String[] args) { 
     HelloWorld app = new HelloWorld(); 
     System.out.println("say"); 
     app.print(); 

     System.out.println("what"); 
     app.print(); 
} 

Die Ausgabe sieht wie folgt aus:

say 
what 
hola, world ! 
hola, world ! 

Die native Funktion ist wie folgt:

Java_HelloWorld_print(JNIEnv *env, jobject obj) { 
    printf("hola, world !\n"); 
    return; 
} 
+1

Macht fflush nach dem Drucken im nativen Code einen Unterschied? –

+0

meinst du fflush (stdout); ?? weil ich das probiert habe und die gleiche ausgabe gegeben habe. Danke –

+0

oh sorry, ich aktualisierte falsche native Methode. Ja, mit fflush (stdout) macht den Unterschied. Vielen Dank. –

Antwort

3

ist dies, weil einheimische Anrufe ausgeführt werden, nachdem Java

ruft

Nein, es hat fast sicher damit zu tun, wie die Ausgabe auf C++ - und Java-Seite gepuffert wird.

Die Ausführungsreihenfolge der Aufrufe ist genau so, wie sie in Ihrem Code erscheint (Java, C++, Java, C++).

Verwandte Themen