java - JNI system.out 和 printf 行为

标签 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 程序是在“之前”和“之后”语句之间执行的(打印数字 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/

相关文章:

java - JNI 到 Java 异常中的 NoSuchMethodError

Java 和 SDL_GetKeyState()

java - Windows 10 - 系统环境变量(路径与 PATH)

java - String.split,将 String 转换为 int

java - 在操作高度值时从 BufferedImage 获取像素

c - 解释这个 gcc 函数的类型化行为

java - 如何获取对 Java 中创建的 GoogleMap 对象的引用?

c - 切换其他人写入您的终端的权限的过程 [Unix] [C]

c - 在 "if"检查失败后询问用户输入的更好方法是什么?

c - GCC 4.0.2 取消引用指向结构的双类型成员的指针会引发 SIGBUS 错误