本文介绍了保持一个全球参考JNIEnv的环境的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我存储了的JNIEnv 在全球,所以我可以在以后调用静态Java方法。但它是nessasary存储了一个全球性的指针的JNIEnv ,他们的方法之一将与其他Java对象,或者是它不需要这种特殊情况。

 的JNIEnv * globalEnvPointer;[JNICALL等]无效的init(JNIEnv的* ENV [等])
{
   //需要?
   globalEnvPointer =(JNIEnv的*)(ENV *) - GT; GetGlobalRef(ENV,ENV);
   //或者是这个行吗?
   globalEnvPointer = ENV;
}

修改

我兵有点哑这里,所有会使用 globalEnvPointer ,是我的init中调用的方法,因为我的的init 其实是我的 C 程序的方法,该方法将不会返回,直到节目结束。我也用在C程序中没有其他线程。我想,这简化了答案。

 的JNIEnv * globalEnvPointer;[JNICALL等]无效的主要(JNIEnv的* ENV [等])
{
   //需要?
   globalEnvPointer =(JNIEnv的*)(ENV *) - GT; GetGlobalRef(ENV,ENV);
   //或者是这个行吗?
   globalEnvPointer = ENV;
   的someMethod();
}无效的someMethod()
{
   //使用globalEnvPointer这里
}


解决方案

您无法缓存的JNIEnv 指针。你可以了解一下:

What you can do is to cache the JavaVM pointer instead.

static JavaVM *jvm;

[JNICALL etc] void init(JNIENv* env, [etc])
{
   jint rs = (*env)->GetJavaVM(env, &jvm);
   assert (rs == JNI_OK);
}

And then whenever you need then JNIEnv pointer from a context where it is not given you do this:

void someCallback() {
    JNIEnv *env;
    jint rs = (*jvm)->AttachCurrentThread(jvm, &env, NULL);
    assert (rs == JNI_OK);
    // Use the env pointer...
}

But whenever you call a native method from Java the env pointer to use is given:

JNIEXPORT jint JNICALL Java_package_Class_method(JNIEnv *env, jobject obj) {
    // just use the env pointer as is.
}

这篇关于保持一个全球参考JNIEnv的环境的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-21 17:22