2016-10-13 15 views
0

Javaでpublic native static void printSpielerToFile(Spieler s[], int length);メソッドがあります。
私はJavaでそのようにそれを呼び出す:アプリケーション終了後にJNIメソッドが実行される

public static void setMeineSpieler(ArrayList<Spieler> meineSpieler) { 
    JNIResultSet.meineSpieler = meineSpieler; 
    // size -1 because the last object is empty due to the empty row on the bottom 
    Spieler[] s = new Spieler[meineSpieler.size() - 1]; 

    for (int i = 0; i < meineSpieler.size() - 1; i++) { 
     s[i] = meineSpieler.get(i); 
    } 
    printSpielerToFile(s, s.length); 
} 

とCのコードは以下のようになります。

JNIEXPORT void JNICALL 
Java_model_JNIResultSet_printSpielerToFile(JNIEnv *env, jclass jcl, jobjectArray arr, jint len) { 
int i = 0; 
printf("length: %d", len); 
} 

すべてがJavaで正常に動作しますが、問題は、Cのコードがだけにした場合に実行されるということですアプリケーションは終了しました。
私はLinuxでスクリプトを使ってアプリケーションを起動し、終了するとメソッドが実行されます。
はそのようになっていること:

enter image description here

だから私の質問は:なぜ、この方法は、終了後ではなく、すぐにJavaでそれを呼び出した後に実行していますか?

答えて

2

なぜこのメソッドは終了後に実行され、javaで呼び出された直後ではありませんか?

これはありません。コンソールの出力がコンソールに表示されますが、以前に実行されたメソッドです。

標準出力はバッファリングされており、明示的にフラッシュまたはクローズすることはありません。また、プログラムの実行中にバッファを満たすのに十分でないため、プログラム終了時にstdoutを閉じるまで出力が表示されません。出力は、すぐにそれが印刷されてコンソールに表示させるために、printf()後、あなたのネイティブメソッドに

fflush(stdout); 

を追加します。

+0

ありがとうございました! – mafioso

+0

私のネイティブメソッドで1つ以上のprintf()がある場合、 'fflush(stdout)'をどこに置くべきですか? – mafioso

+1

@mafioso、 'fflush()'は指定されたファイルのバッファを、その名前が示唆するようにフラッシュします。ネイティブメソッドがすべての印刷を終了するまで、コンソールに何も表示する必要がなければ、 'fflush()'を最後に置いてください。それ以外の場合は、必要な場所に置いてください。必要に応じて複数の通話を使用します。 –

関連する問題