1

NewGlobalRef function次のコードを使用して機能を実装しようとしていました。次のコードの関数は、3 秒のギャップで Java コードによって呼び出されます。関数が呼び出されると、呼び出された回数が表示されます。最初の出力は正常に取得されますが、残りの出力はガベージ値です。この理由はわかりません。次のコードの後の出力に従います。

#include <stdio.h>
#include "Package_UsingGlobalVariable.h"

void Java_Package_UsingGlobalVariable_evaluator
  (JNIEnv *env, jobject obj) {
jclass cls = (*env)->GetObjectClass(env,obj);
jfieldID fid = (*env)->GetFieldID(env,cls,"count","I");
jint count = (*env)->GetIntField(env,obj,fid);
jclass intGlbRef;
if(count == 0) {
    printf("Number of times this function has been accessed : %d\n",++count);
    (*env)->SetIntField(env,obj,fid,-1); // count changed to -1 : function has been accessed atleast once
    jclass intLclRef = (*env)->FindClass(env,"java/lang/Integer");
      if(intLclRef == NULL) {
        return NULL;
      }
    intGlbRef = (*env)->NewGlobalRef(env,intLclRef);
    intGlbRef = count;
} else {
    jint c;
    c = (jint)intGlbRef;
    printf("Number of times this function has been accessed : %d\n",++c);
    intGlbRef = (jint)c;
    if( c == 3) {
        (*env)->DeleteGlobalRef(env,intGlbRef);
    }
}
}

出力:

Number of times this function has been accessed : 1
Number of times this function has been accessed : 25666561
Number of times this function has been accessed : 25666561

Java コード:

public class UsingGlobalVariable {
private native void evaluator();
private int count;

public UsingGlobalVariable() {
    count = 0;
}

public static void main(String... args) {
    UsingGlobalVariable o = new UsingGlobalVariable();
    try {
        int i = 0;
        while(i<3) {
            o.evaluator();
            Thread.sleep(3000);
            i++;
        }
    }catch(Exception exc) {
        exc.printStackTrace();
    }
}

static {
    System.loadLibrary("UsingGlobalVariable");
}

}

Cコードの問題は何ですか?

Cコンパイラによる警告:

W:\elita\jnitesters\workspace\c\UsingGlobalVariable\UsingGlobalVariable.c|11|warning: format '%d' expects type 'int', but argument 2 has type 'jint'|
W:\elita\jnitesters\workspace\c\UsingGlobalVariable\UsingGlobalVariable.c|15|warning: 'return' with a value, in function returning void|
W:\elita\jnitesters\workspace\c\UsingGlobalVariable\UsingGlobalVariable.c|18|warning: assignment makes pointer from integer without a cast|
W:\elita\jnitesters\workspace\c\UsingGlobalVariable\UsingGlobalVariable.c|22|warning: format '%d' expects type 'int', but argument 2 has type 'jint'|
W:\elita\jnitesters\workspace\c\UsingGlobalVariable\UsingGlobalVariable.c|23|warning: assignment makes pointer from integer without a cast|
W:\elita\jnitesters\workspace\c\UsingGlobalVariable\UsingGlobalVariable.c|21|warning: 'intGlbRef' may be used uninitialized in this function|
||=== Build finished: 0 errors, 6 warnings ===|

最後の警告は問題の解決に役立つ可能性がありますがintglbRef、if-else ブロックの外側で宣言する以外の方法は考えられません。結果として得られるように、どのように宣言する必要が1,2,3ありますか?

4

0 に答える 0