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 ...
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. –
... Aber Sie müssen es nicht anhängen, wenn Sie nicht in Java zurückrufen werden. –