2016-07-14 6 views
3

Wenn ich ein C/C++ aus Java anrufe, ist ein neuer Thread von JavaVM oder JNI erstellt, um den C/C++ Code auszuführen, während mein Java-Thread wartet? Ich frage das, weil mein C/C++ - Code etwas auf der GPU ausführt und ich einen bestimmten Puffer überprüfen muss, um das Ergebnis zurück zu bekommen. Sobald ich das Ergebnis habe, muss ich meine Java-Funktion erneut aufrufen.JNI-Fadenmodell?

Also dachte ich über das Erstellen eines Threads auf der C++ - Seite, die ständig den Puffer überprüft und sobald einige Daten verfügbar sind, ruft er zurück auf die Java-Seite.

+1

JNI-Aufrufe werden für denselben Thread ausgeführt. Wenn Sie einen neuen Thread auf der C++ Seite erstellen, müssen Sie ihn korrekt an die Java VM anhängen, wenn Sie Callbacks durchführen möchten. –

+0

... Aber Sie müssen es nicht anhängen, wenn Sie nicht in Java zurückrufen werden. –

Antwort

4

Der JNI erstellt keinen neuen Thread hinter der Szene. Eine native Funktion wird im selben Thread wie die Java-Methode ausgeführt, die die native Funktion aufruft. Und umgekehrt, wenn systemeigener Code eine Java-Methode aufruft, wird die Java-Methode im selben Thread wie der native Code ausgeführt, der die Methode aufruft.

Es hat Konsequenzen - ein nativer Funktionsaufruf kehrt zu Java-Code zurück, wenn die native Funktion zurückkehrt und der native Code die Ausführung fortsetzt, wenn eine aufgerufene Java-Methode zurückgegeben wird.

Wenn ein systemeigener Code eine Verarbeitung ausführt, die in einem separaten Thread ausgeführt werden soll, muss der Thread explizit erstellt werden. Sie können entweder einen neuen Java-Thread erstellen und eine systemeigene Methode von diesem dedizierten Thread aufrufen. Oder Sie können einen neuen nativen Thread im systemeigenen Code erstellen, ihn starten und von der nativen Funktion zurückkehren.

// 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);  
} 

Wenn Sie die zweite Variante verwenden und Sie wollen nativ haben Sie erstellt ein Java-Rückruf von einem Thread rufen, den Faden zu JVM befestigen. Wie es geht? Siehe JNI Attach/Detach thread memory management ...