我试图NewGlobalRef function
通过以下代码实现的功能。以下代码中的函数由 Java 代码以 3 秒的间隔调用。当函数被调用时,它会显示它被调用了多少次。我确实得到了第一个输出,但剩余的输出是一些垃圾值。我不知道这是什么原因。遵循以下代码后的输出。
#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
结果?