【发布时间】:2012-09-09 17:08:08
【问题描述】:
我知道我不能保留对数组内部的引用,所以我想知道是否可以保留指向 java 数组对象或任何 java 对象的全局指针。以及我从 C++ 创建它是否有任何区别。
它有效,但我担心垃圾收集器可能会重新定位内存(我理解这是JNIEnv 上的Get... 和Release... 方法的原因)。
//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
}
【问题讨论】:
-
请注意,如果您从不将本机数组(使用 malloc 或 new 创建)作为全局变量,则可以在 JNI 组件中将其传递给 Java 方法。在其他情况下,使用 DirectByteBuffer 类非常有效。
-
@AlexCohn 谢谢,是的,我应该明确表示我确实在传递给 java 方法。不过,我会调查
DirectByteBuffer,谢谢。
标签: c++ android-ndk java-native-interface