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

pad*_*apa 6 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();
}
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

say
what
hola, world !
hola, world !
Run Code Online (Sandbox Code Playgroud)

本机功能如下:

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

NPE*_*NPE 3

这是因为本地调用是在Java调用之后执行的吗

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

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