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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Referenz ist nur, dass Sie -- eine Referenz. Es wird nicht verhindern, dass das Objekt, das es bezeichnet wird verlegt. Es wird verhindern, dass das Objekt aus der sich erinnert; lokale Verweise werden automatisch zerstört, nach der Rückkehr, da Sie aber über eine Globale variable, die Sie verwenden sollten, eine weltweite Referenz, die eine manuelle Verwaltung. Sehen
NewGlobalRef
undDeleteGlobalRef
.