Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI线程模型?_Java_C++_Multithreading_Java Native Interface_Jnienv - Fatal编程技术网

Java JNI线程模型?

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方法与调用该方法的本机代码在同一

当我从Java调用C/C++时,是由JavaVM或JNI创建了一个新线程,在Java线程等待时运行C/C++代码吗? 我这样问是因为我的C/C++代码在GPU上运行,我需要检查一个特定的缓冲区以返回结果。得到结果后,我需要再次调用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);    
}