var不会变成全局但仍然是本地的

从下面的代码片段开始,我尝试测试NewGlobalRef并尝试在if块的本地范围内声明它后使clsStr全局。

 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 = (*env)->NewGlobalRef(env,cls) var全局时,得到的错误是clsStr未定义?

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

你也可以

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

当我使用语句clsStr = (*env)->NewGlobalRef(env,cls) var global时

这是一种误解 – 你不能通过任务使全局变量; 你通过全球范围内的声明来做到这一点。 您可以通过赋值初始化变量,但这与其范围没有任何关系。