JNI堆栈序列误解

时间:2012-02-17 04:28:55

标签: java c java-native-interface

我在一个非常简单的JNI示例(Java + C)中有以下代码

爪哇

    package jnitest;


public class JNITest {

  static {
    System.load("C:/.../JNItestNative.dll");
  }

  public native void hello();

  public static void main(String[] args) {
    JNITest jniTest = new JNITest();

    System.out.println("Hello in java");
    jniTest.hello();
    System.out.println("Bye in java");
  }
}

C

    /* 
 * File:   jnitestnative.c
 * Author: DEFAULT
 *
 * Created on February 17, 2012, 12:24 PM
 */

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>

/*
 * 
 */
JNIEXPORT void JNICALL Java_jnitest_JNITest_hello
  (JNIEnv *env, jobject obj) {

  printf("Hello in C\n");
  printf("Bye in C\n");

  return;
}

我希望结果是这样的:

Hello in Java
Hello in C
Bye in C
Bye in Java

但它真的是这样的:

Hello in java
Bye in java
Hello in C
Bye in C

1 个答案:

答案 0 :(得分:1)

当我运行您发布的代码时,我得到了预期的输出。由于stdout由标准C库缓冲,而JVM倾向于绕过C库并直接使用OS调用,因此可能会发生一些奇怪的缓冲。

如果是这种情况,您可以在从C:

返回之前始终刷新stdout
printf("Hello in C\n");
printf("Bye in C\n");
fflush(stdout);
return;