Java JNI线程模型?
当我从Java调用C/C++时,是由JavaVM或JNI创建了一个新线程,在Java线程等待时运行C/C++代码吗? 我这样问是因为我的C/C++代码在GPU上运行,我需要检查一个特定的缓冲区以返回结果。得到结果后,我需要再次调用Java函数Java JNI线程模型?,java,c++,multithreading,java-native-interface,jnienv,Java,C++,Multithreading,Java Native Interface,Jnienv,当我从Java调用C/C++时,是由JavaVM或JNI创建了一个新线程,在Java线程等待时运行C/C++代码吗? 我这样问是因为我的C/C++代码在GPU上运行,我需要检查一个特定的缓冲区以返回结果。得到结果后,我需要再次调用Java函数 我想在C++端上创建一个线程,它连续检查缓冲区,一旦有可用的数据,就调用java端。p> JNI不会在幕后创建任何新线程。本机函数与调用本机函数的java方法在同一线程中执行。反之亦然,当本机代码调用java方法时,java方法与调用该方法的本机代码在同一
<>我想在C++端上创建一个线程,它连续检查缓冲区,一旦有可用的数据,就调用java端。p> 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();
}
};
如果使用第二个变量,并且希望从本机创建的线程调用java回调,则必须将该线程附加到JVM。怎么做?请参阅…JNI调用是在同一线程上进行的。如果在C++侧创建一个新线程,如果需要回调,则需要正确地将其附加到java VM上。但是,如果不调用java,则不需要附加它。
// 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);
}