JNIは、シーンの背後に新しいスレッドを作成しません。ネイティブ関数は、ネイティブ関数を呼び出すjavaメソッドと同じスレッドで実行されます。逆にネイティブコードがJavaメソッドを呼び出すと、javaメソッドはメソッドを呼び出すネイティブコードと同じスレッドで実行されます。
結果 - ネイティブ関数が呼び出されたときにネイティブ関数が返ってネイティブコードが実行されたときに、ネイティブ関数呼び出しがJavaコードに戻ります。
ネイティブコードが別のスレッドで実行される処理を行う場合、そのスレッドを明示的に作成する必要があります。新しいJavaスレッドを作成し、この専用スレッドからネイティブメソッドを呼び出すことができます。または、ネイティブコード内に新しいネイティブスレッドを作成して起動し、ネイティブ関数から戻ることができます。
// Call a native function in a dedicated java thread
native void cFunction();
...
new Thread() {
public void run() {
cFunction();
}
};
// Create a native thread - java part
native void cFunction()
...
cFunction();
// Create a native thread - C part
void *processing_function(void *p);
JNIEXPORT void JNICALL Java____cFunction(JNIEnv *e, jobject obj) {
pthread_t t;
pthread_create(&t, NULL, processing_function, NULL);
}
あなたは第二の変形例を使用すると、あなたがJVMにスレッドを添付する必要がネイティブに作成されたスレッドからJavaコールバックを呼び出したい場合。どうやってするの? JNI Attach/Detach thread memory management ...
JNI呼び出しは同じスレッドで行われます。 C++側で新しいスレッドを作成する場合は、コールバックを作成したい場合は、Java VMに正しくスレッドを追加する必要があります。 –
...ただし、Javaにコールバックしない場合は、接続する必要はありません。 –