Przechwytywam JNIEnv
w globalnym, więc mogę nazwać statyczne metody java później. Ale czy nie jest konieczne zapisywanie globalnego wskaźnika do JNIEnv
, w jaki sposób można by to zrobić z jakimkolwiek innym obiektem java, czy też jest to specjalny przypadek, który tego nie wymaga.Utrzymywanie globalnego odniesienia do środowiska JNIEnv
JNIEnv* globalEnvPointer;
[JNICALL etc] void init(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
}
Edit
mam bing nieco głupi tutaj, wszystkie metody, które wykorzystują globalEnvPointer
, są wywoływane w moim init, ponieważ mój init
jest rzeczywiście main
metoda mojego c
programu, który wygrał” t powrót do końca programu. Używam również żadnych innych wątków w programie c. Myślę, że to upraszcza odpowiedź. Nie można buforować wskaźnika
Wszystko jedno, czy to ma znaczenie? tzn. mój 'init' jest wywoływany w tym samym wątku, który później wywoła statyczne metody java. – weston
Zawsze używaj wskaźnika 'JNIEnv', który wchodzi w funkcję C. Jak w moim ostatnim przykładzie. – maba
Proszę zobaczyć moją edycję, w twoim przykładzie, jeśli 'Java_package_Class_method' nazywa się' someCallback', nie musiałbyś iść przez 'JavaVM', prawda? W efekcie robię to, używając globalnej zamiast przekazywać ją do 'someCallback'. – weston