配列の内部への参照を保持できないことを知っているので、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
}