3

我知道我不能保留对数组内部的引用,所以我想知道是否可以保留指向 java 数组对象或任何 java 对象的全局指针。以及我从 C++ 创建它是否有任何区别。

它有效,但我担心垃圾收集器可能会重新定位内存(我理解它的原因Get...Release...方法JNIEnv)。

//global jfloatArray
jfloatArray jarray;

//called once
JNIEXPORT void Java_com_example_test1_Main_Init
  (JNIEnv *env, jclass thiz){
    //create once
    jarray = env->NewFloatArray(10);  //if valid, would it be as valid to pass it in?
}

//called repeatedly
JNIEXPORT void JNICALL
Java_com_example_test1_Main_loop(JNIEnv* env, jobject thiz) {    
    //use jarray in here
}

编辑:

这是正确的代码。

//global jfloatArray
jfloatArray jarray;

//called once
JNIEXPORT void Java_com_example_test1_Main_Init
  (JNIEnv *env, jclass thiz){
      //create once
      //create it - this gives a local reference
      jfloatArray local_jarray = env->NewFloatArray(10);
      //get a global reference, cast it and set to the global "jarray"
      jarray = (jfloatArray) env->NewGlobalRef(local_jarray);
      //delete the local reference
      env->DeleteLocalRef(local_jarray);
}

//called repeatedly
JNIEXPORT void JNICALL
Java_com_example_test1_Main_loop(JNIEnv* env, jobject thiz) {    
    //use jarray in here
}
4

1 回答 1

2

您的参考只是一个参考。它不会阻止它引用的对象被重新定位。它将防止对象被重新收集局部引用在返回后会自动销毁,但是由于你使用的是全局变量,所以你应该使用全局引用,这需要手动管理。见NewGlobalRefDeleteGlobalRef

于 2012-09-09T08:47:46.373 回答