JNI system.out和printf行为
我正在编写一个程序,它使用JNI与简单的c程序进行交互。 我创建了以下程序:
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"); }
和
JNIEXPORT int JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { printf("Hello JNI\n"); return 10; }
令我惊讶的是这个程序返回:
before 10 after Hello JNI
对我来说这很奇怪,因为很明显c程序是在“before”和“after”语句之间执行的(打印数字10)。 但是为什么printf语句在调用时不会被执行。 它是否以某种方式被jvm阻止,因为只允许一个程序同时写入输出? 有没有办法纠正这种行为?
是。 你需要调用flush
。
在C
,这是fflush调用 –
printf("Hello JNI\n"); fflush(stdout); return 10;
在Java
,这只是在流上 –
System.out.println("before"); System.out.flush();