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
ありますか?