Ich speichere von JNIEnv
in einem globalen, damit ich statische Methoden später aufrufen kann. Aber ist es notwendig, einen globalen Zeiger auf die JNIEnv
zu speichern, so wie man es mit jedem anderen Java-Objekt machen würde, oder ist es ein Spezialfall, der dies nicht erfordert.Behalten Sie einen globalen Verweis auf die JNIEnv-Umgebung
JNIEnv* globalEnvPointer;
[JNICALL etc] void init(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
}
bearbeiten
ich hier ein bisschen dumm bin bing, alle Methoden, die globalEnvPointer
, sind in meinem init aufgerufen, weil mein init
ist eigentlich mein c
Programm main
Methode, die ‚gewonnen verwenden t Rückkehr bis zum Ende des Programms. Ich verwende auch keine anderen Threads im c-Programm. Ich denke, das vereinfacht die Antwort.
JNIEnv* globalEnvPointer;
[JNICALL etc] void main(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
someMethod();
}
void someMethod()
{
//use globalEnvPointer here
}
Es ist alles ein Thread, macht das einen Unterschied? d. h. mein 'init' wird im selben Thread aufgerufen wie später die statischen Java-Methoden. – weston
Verwenden Sie immer den 'JNIEnv'-Zeiger, der in der C-Funktion eingeht. Wie in meinem letzten Beispiel. – maba
Bitte sehen Sie meine Bearbeitung, in Ihrem Beispiel, wenn 'Java_package_Class_method'' someCallback' genannt wird, müssten Sie nicht über 'JavaVM' gehen, oder? In der Tat ist das, was ich tue, nur mit einem globalen, anstatt es an "someCallback" zu übergeben. – weston