Когда я вызываю C / C ++ из Java, создается ли JavaVM или JNI новый поток для запуска кода C / C ++, пока мой поток Java ожидает?
Я спрашиваю об этом, потому что мой код на C / C ++ запускает что-то на GPU, и мне нужно проверить определенный буфер, чтобы получить результат обратно. Как только у меня будет результат, мне нужно снова вызвать функцию Java.
Поэтому я думал о создании потока на стороне C ++, который постоянно проверяет буфер и, как только появляются некоторые данные, выполняет обратный вызов на стороне Java.
JNI не создает никаких новых потоков за сценой. Нативная функция выполняется в том же потоке, что и Java-метод, который вызывает нативную функцию. И наоборот, когда нативный код вызывает метод 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);
}
Если вы используете второй вариант и хотите вызвать обратный вызов Java из нити, созданной изначально, вы должны присоединить нить к JVM. Как это сделать? Увидеть JNI Присоединение / Отключение управления памятью потока …
Других решений пока нет …