3

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

1 に答える 1

2

あなたの参照は単にそれです-参照。参照しているオブジェクトの再配置を妨げることはありません。オブジェクトが再収集されるのを防ぎます。ローカル参照は戻った後に自動的に破棄されますが、グローバル変数を使用しているため、グローバル参照を使用する必要があります。これには手動での管理が必要です。NewGlobalRefおよびを参照してくださいDeleteGlobalRef

于 2012-09-09T08:47:46.373 に答える