我知道我不能保持对数组内部的引用,所以我想知道是否可以保留一个指向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
}
答案 0 :(得分:1)
您的参考仅仅是 - 参考。它不会阻止它所引用的对象被重新定位。 将阻止对象被重新收集;返回后会自动销毁本地引用,但由于您使用的是全局变量,因此应使用全局引用,这需要手动管理。请参阅NewGlobalRef
和DeleteGlobalRef
。