java - JNI 栈顺序误解

标签 java c java-native-interface

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

Java

    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

最佳答案

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

如果是这种情况,您始终可以在从 C 返回之前刷新 stdout:

printf("Hello in C\n");
printf("Bye in C\n");
fflush(stdout);
return;

关于java - JNI 栈顺序误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9322915/

相关文章:

c - 在 OpenMP 并行代码中,并行运行 memset 会有什么好处吗?

C:AF_UNIX 套接字上的剩余字节

c - 在c中退出作用域时防止内存重用

java - 如何使用 java 合并 .webm(音频)文件和 .mp4(视频)文件?

java - C++无法使用JNI在Java类中找到构造函数

android - 如何在 Android 中使用编译的 OpenSSL 进行 AES 加密

java - 将字符串转换为日期并格式化为 MS Access 2007 数据库

java - 对线程安全的质疑

Java 正则表达式和 .matches()

java - 打印数字的二进制数字