Sto memorizzando JNIEnv
in modo globale, quindi è possibile chiamare i metodi java statici in un secondo momento. Ma è necessario memorizzare un puntatore globale sullo JNIEnv
, come se fosse un qualsiasi altro oggetto java, oppure è un caso speciale che non richiede questo.Mantenere un riferimento globale all'ambiente JNIEnv
JNIEnv* globalEnvPointer;
[JNICALL etc] void init(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
}
Modifica
sto bing un po 'stupido qui, tutti i metodi che utilizzeranno globalEnvPointer
, vengono richiamati nel mio init perché il mio init
è in realtà il metodo mio programma di c
main
, che ha vinto' t ritorno fino alla fine del programma. Sto anche usando nessun altro thread nel programma c. Penso che questo semplifica la risposta.
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
}
È tutto un thread, fa la differenza? Ad esempio, il mio 'init' viene chiamato nello stesso thread che chiamerà in seguito i metodi java statici. – weston
Usa sempre il puntatore 'JNIEnv' che sta entrando nella funzione C. Come nel mio ultimo esempio. – maba
Per favore vedi la mia modifica, nel tuo esempio, se 'Java_package_Class_method' ha chiamato' someCallback', non avresti bisogno di passare tramite 'JavaVM', vero? In effetti questo è quello che sto facendo, semplicemente usando un global piuttosto che passarlo a 'someCallback'. – weston