Недопонимание последовательности стека JNI - PullRequest
1 голос
/ 17 февраля 2012

У меня есть следующий код в очень простом примере 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

1 Ответ

1 голос
/ 17 февраля 2012

Когда я запускаю код, который вы разместили, я получаю ожидаемый результат. Может происходить странная буферизация из-за того факта, что stdout буферизируется стандартной библиотекой C, в то время как JVM стремится обойти библиотеку C и напрямую использовать вызовы ОС.

В этом случае вы всегда можете сбросить stdout перед возвратом из C:

printf("Hello in C\n");
printf("Bye in C\n");
fflush(stdout);
return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...