2016-07-14 8 views
3

JavaからC/C++を呼び出すと、Javaスレッドが待機している間にJavaVMまたはJNIによって作成された新しいスレッドがC/C++コードを実行しますか? 私はC/C++コードがGPU上で何かを実行するので、結果を得るために特定のバッファをチェックする必要があるので、これを尋ねます。結果が出たら、Java関数をもう一度呼び出す必要があります。JNIスレッドモデル?

私はC++側でバッファを連続的にチェックするスレッドを作成し、利用可能なデータがあればJava側にコールバックすることを考えていました。

+1

JNI呼び出しは同じスレッドで行われます。 C++側で新しいスレッドを作成する場合は、コールバックを作成したい場合は、Java VMに正しくスレッドを追加する必要があります。 –

+0

...ただし、Javaにコールバックしない場合は、接続する必要はありません。 –

答えて

4

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 ...