Java 你能缓存JNIEnv吗?

Java 你能缓存JNIEnv吗?,java,java-native-interface,Java,Java Native Interface,跨多个JNI调用缓存JNIEnv对象安全吗?例如,我可以做一些类似的事情吗 void foo(JNIEnv* env) { static JNIEnv* cached; if( ! cached ) cached = env; /* use cached */ } 当然,实际上我的代码并没有这么傻,但上面的示例确实很好地演示了用例。是的,您可以,但只能在单个线程中。您的缓存不能像上面那样简单,除非您以某种方式确定您的本机代码将只在单个线程上被调用。否则

跨多个JNI调用缓存JNIEnv对象安全吗?例如,我可以做一些类似的事情吗

void foo(JNIEnv* env)
{
    static JNIEnv* cached;
    if( ! cached )
        cached = env;

    /* use cached */
}

当然,实际上我的代码并没有这么傻,但上面的示例确实很好地演示了用例。

是的,您可以,但只能在单个线程中。您的缓存不能像上面那样简单,除非您以某种方式确定您的本机代码将只在单个线程上被调用。否则,您需要使用线程本地存储来保存JNIEnv引用。

的确如此。我实际上是在一个结构中缓存JNIEnv,并且该结构将仅从创建它的线程中使用。