JNI调用与常规Java调用交错 - 执行顺序是什么?

时间:2012-04-28 05:49:30

标签: java java-native-interface

我最近一直在试验JNI,以便移植一些现有的C ++库。

作为测试的一部分,我创建了一个简单的'helloworld'程序。我在C ++中调用一个简单的本机函数,它只打印消息。我对执行程序时观察到的一些行为感到好奇 - 似乎所有本机函数消息/响应都在Java System.out.print之后打印出来。这是因为本机调用是在Java调用之后执行的,还是我应该忽略这种行为?

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

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

输出如下:

say
what
hola, world !
hola, world !

原生功能如下:

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

1 个答案:

答案 0 :(得分:3)

  

这是因为在Java调用

之后执行本机调用

不,它几乎肯定与输出在C ++和Java端缓冲的方式有关。

调用的执行顺序与您的代码(Java,C ++,Java,C ++)中的执行顺序完全相同。