1

我试图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结果?

4

0 回答 0