Hos*_*ein 5 c++ java java-native-interface multithreading jnienv
当我从Java调用C/C++时,JavaVM或JNI创建的新线程是否在我的Java线程等待时运行C/C++代码?我问这个是因为我的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();
}
};
Run Code Online (Sandbox Code Playgroud)
// 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);
}
Run Code Online (Sandbox Code Playgroud)
如果您使用第二个变体并且想要从本机创建的线程调用java回调,则必须将该线程附加到JVM.怎么做?请参阅JNI Attach/Detach线程内存管理 ...