JNI / Android NDK — ведение глобальной ссылки на объект

Я знаю, что не могу сохранить ссылку на внутреннюю часть массива, поэтому мне было интересно, можно ли сохранять глобальный указатель на объект массива 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
}

2

Решение

Ваша ссылка — это просто ссылка. Это не помешает перемещению объекта, на который он ссылается. Это будут не допустить повторного выбора объекта; локальные ссылки автоматически удаляются после возврата, но поскольку вы используете глобальную переменную, вам следует использовать глобальную ссылку, что требует ручного управления. Увидеть NewGlobalRef а также DeleteGlobalRef.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]