0

从下面的代码片段中,我尝试在块的本地范围内声明它后进行测试NewGlobalRef并尝试使其成为全局。clsStrif

jstring Java_Package_LocalAndGlobalReference_returnGlobalReference
 (JNIEnv *env, jobject obj) {
if(1) {
    printf("In function make global reference\n");
    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:\elita\jnitesters\workspace\c\LGR\LGR.c:31: error: 'clsStr' undeclared (first use in this function)
W:\elita\jnitesters\workspace\c\LGR\LGR.c:31: error: (Each undeclared identifier is reported only once
W:\elita\jnitesters\workspace\c\LGR\LGR.c:31: error: for each function it appears in.)

clsStr当我使用 satement 将 var 设为全局时,为什么我会收到未定义的错误消息clsStr = (*env)->NewGlobalRef(env,cls)

4

1 回答 1

4

当您在块中声明变量时(在这种情况下,您clsStr在块中声明 ifif(1) { ... }语句),该变量的范围(及其生命周期)就是该块。return clsStr 这意味着当您在阻止时它不存在。

你可以

  • 在块内移动 return 语句,或
  • clsStr在语句之前if(1) { ... }声明变量

当我使用该语句将该 var 设为全局时clsStr = (*env)->NewGlobalRef(env,cls)

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

于 2012-05-15T08:30:35.477 回答