在多线程应用程序中缓存JNI环境

时间:2014-04-21 10:45:11

标签: java android c++ multithreading java-native-interface

我有一个使用多个线程的android应用程序(例如ui thread一个网络线程)。现在我希望两个线程都调用本机函数。还有一些本机函数会调用java函数。

为此,需要JNIEnv*,这与线程不同。但我认为调用GetEnv()非常低效。

有没有办法为每个线程缓存JNIEnv*,然后确定我们在哪个线程(在本机函数中)使用正确的缓存JNIEnv*

1 个答案:

答案 0 :(得分:0)

您无法缓存JNIEnv,并且应该在缓存的JVM *上使用AttachCurrentThread()。如果本机线程已经附加,我相信这个函数等同于NOOP。

if ((*jvm)->AttachCurrentThread(jvm, (void **)(&env), NULL) == JNI_OK) {
   ....
}