2016-07-14 50 views
3

当我从Java调用C/C++时,是由JavaVM还是JNI创建的一个新线程,用于在Java线程正在等待时运行C/C++代码? 我问这是因为我的C/C++代码在GPU上运行某些东西,我需要检查一个特定的缓冲区才能得到结果。一旦我得到结果,我需要再次调用我的Java函数。JNI线程模型?

所以我正在考虑在C++端创建一个连续检查缓冲区的线程,并且一旦有一些可用的数据,就回拨给Java端。

+1

JNI调用是在同一个线程上进行的。如果你在C++端创建一个新的线程,你需要将它正确地附加到Java VM,如果你想这样做回调。 –

+0

......但是,如果您不打算回调Java,则不需要附加它。 –

回答

4

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 Attach/Detach thread memory management ...