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.)

clsStrsatementを使用してそのvarをグローバルにしたときに、それが未定義であるというエラーが表示されるのはなぜclsStr = (*env)->NewGlobalRef(env,cls)ですか?

4

1 に答える 1

4

ブロック内で変数を宣言する場合(この場合、ステートメントclsStrの場合はブロック内で宣言しますif(1) { ... })、その変数のスコープ(およびその存続期間)はそのブロックです。それはあなたがブロックのreturn clsStr に存在しないことを意味します。

あなたはどちらかをすることができます

  • ブロック内でreturnステートメントを移動する、または
  • ステートメントのclsStr前に変数を宣言しますif(1) { ... }

ステートメントを使用してそのvarをグローバルにしたときclsStr = (*env)->NewGlobalRef(env,cls)

これは誤解です。割り当てによって変数をグローバルにすることはできません。これは、グローバルスコープでの宣言によって行います。割り当てによって変数を初期化できますが、それはそのスコープとは何の関係もありません。

于 2012-05-15T08:30:35.477 に答える