从下面的代码片段中,我尝试测试NewGlobalRef
,并在if
块的本地范围内声明后尝试使clsStr
全局。
jstring Java_Package_LocalAndGlobalReference_returnGlobalReference
(JNIEnv *env, jobject obj) {
if(1) {
printf("In function make global referencen");
jclass clsStr ;
jclass cls = (*env)->FindClass(env,"java/lang/String");
if( cls == NULL)
return NULL;
// create a global reference of clsStr
clsStr = (*env)->NewGlobalRef(env,cls);
// Delete the local reference, which is no longer userful
(*env)->DeleteLocalRef(env,cls);
if(clsStr == NULL)
return NULL;
}
return clsStr; // statement 31
}
当我运行上面的代码片段时,我收到以下错误:
W:elitajnitestersworkspacecLGRLGR.c:31: error: 'clsStr' undeclared (first use in this function)
W:elitajnitestersworkspacecLGRLGR.c:31: error: (Each undeclared identifier is reported only once
W:elitajnitestersworkspacecLGRLGR.c:31: error: for each function it appears in.)
为什么当我使用 satement clsStr = (*env)->NewGlobalRef(env,cls)
使该 var 全局时,我会收到错误,说clsStr
未定义?
当您在块中声明变量时(在本例中,如果 if(1) { ... }
语句,则在块中声明clsStr
),该变量的作用域(及其生存期)就是该块。这意味着当您在块之后return clsStr
时它不存在。
你可以
- 将 return 语句移动到块内,或
- 在
if(1) { ... }
语句之前声明变量clsStr
当我使用语句使该 var 全局时
clsStr = (*env)->NewGlobalRef(env,cls)
这是一个误解 - 你不能通过赋值使变量成为全局变量;你通过在全局范围内的声明来实现。您可以通过赋值初始化变量,但这与其作用域没有任何关系。