JNI system.out和printf行为

时间:2014-04-15 13:23:09

标签: java c java-native-interface

我正在编写一个程序,它使用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阻止,因为只允许一个程序同时写入输出?有没有办法纠正这种行为?

1 个答案:

答案 0 :(得分:17)

是。您需要致电flush

C中,即fflush来电 -

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

Java中,只是流上的flush -

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