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

Cache JNI environment in a multithreading application

本文关键字:JNI 环境 缓存 多线程 应用程序      更新时间:2023-10-16

我有一个使用多个线程的android应用程序(例如ui线程和网络线程)。现在我希望两个线程都能调用本机函数。此外,一些本机函数将调用java函数。

为此,需要JNIEnv*,它因线程而异。但我认为调用GetEnv()的效率相当低。

有没有一种方法可以缓存每个线程的JNIEnv*,然后确定我们在哪个线程上(在本机函数中)使用正确的缓存JNIEnv*

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

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