VaR 不会成为全局的,但仍然是本地的



从下面的代码片段中,我尝试测试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)

这是一个误解 - 你不能通过赋值使变量成为全局变量;你通过在全局范围内的声明来实现。您可以通过赋值初始化变量,但这与其作用域没有任何关系。

相关内容

  • 没有找到相关文章

最新更新