gpt4 book ai didi

c++ - JNI/Android NDK - 维护全局对象引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:53 25 4
gpt4 key购买 nike

我知道我不能保留对数组内部的引用,所以我想知道是否可以保留指向 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
}

最佳答案

您的引用仅是引用。它不会阻止它引用的对象被重定位。它阻止对象被回收;局部引用返回后会自动销毁,但是既然你使用的是全局变量,就应该使用全局引用,这就需要手动管理。参见 NewGlobalRefDeleteGlobalRef .

关于c++ - JNI/Android NDK - 维护全局对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12337661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com