本文介绍了保持一个全球参考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的环境的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!