Я знаю, что не могу сохранить ссылку на внутреннюю часть массива, поэтому мне было интересно, можно ли сохранять глобальный указатель на объект массива 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
}
Ваша ссылка — это просто ссылка. Это не помешает перемещению объекта, на который он ссылается. Это будут не допустить повторного выбора объекта; локальные ссылки автоматически удаляются после возврата, но поскольку вы используете глобальную переменную, вам следует использовать глобальную ссылку, что требует ручного управления. Увидеть NewGlobalRef
а также DeleteGlobalRef
.
Других решений пока нет …