JNI / Android-NDK - Pflege ein globales Objekt Referenz

Ich weiß, ich kann nicht halten Sie einen Verweis auf die Interna eines array, so dass ich Frage mich, ob es ist OK, um einen globalen Zeiger auf ein java-array-Objekt oder in der Tat jedem java-Objekt. Und ob es einen Unterschied macht, dass ich das erstellen von C++.

Funktioniert es, aber ich war besorgt, dass der garbage collector potenziell verschieben Sie den Speicher (was ich verstehen es ist der Grund für Get... und Release... Methoden auf 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
}

Edit:

Hier ist der richtige code.

//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
}
  • Beachten Sie, dass Sie können verwenden Sie eine native array (erstellt mit malloc oder new), als eine Globale variable in Ihre JNI-Komponente, wenn Sie nie passieren es auf Java-Methoden. In anderen Situationen ist es sehr effizient zu bedienen DirectByteBuffer Klasse.
  • danke, ja, ich sollte haben deutlich gemacht, dass ich in der Tat vorbei zu einer java-Methode. Ich werde untersuchen DirectByteBuffer aber, danke.
InformationsquelleAutor weston | 2012-09-09
Schreibe einen Kommentar