我正在编写一个程序,该程序使用 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 程序是在“之前”和“之后”语句之间执行的(打印数字 10)。但是为什么调用的时候printf语句没有执行呢。它是否以某种方式被 jvm 阻止,因为只允许一个程序同时写入输出?有没有办法纠正这种行为?
最佳答案
是的。您将需要调用 flush
。
在 C
中,即 fflush打电话-
printf("Hello JNI\n");
fflush(stdout);
return 10;
在 Java
中,这就是 flush在流中 -
System.out.println("before");
System.out.flush();
关于java - JNI system.out 和 printf 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23085044/