Estoy almacenando JNIEnv
en un global, así que puedo llamar a los métodos estáticos de java más tarde. Pero es necesario almacenar un puntero global en el JNIEnv
, como lo haría con cualquier otro objeto Java, o es un caso especial que no requiere esto.Guardando una referencia global al entorno JNIEnv
JNIEnv* globalEnvPointer;
[JNICALL etc] void init(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
}
Editar
estoy Bing un poco tonto aquí, todos los métodos que utilizarán globalEnvPointer
, se invocan dentro de mi init porque mi init
es en realidad el método de mi programa c
main
, que ganó' volver hasta el final del programa. Tampoco estoy usando otros hilos en el programa c. Creo que esto simplifica la respuesta.
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
}
Todo es un hilo, ¿eso hace la diferencia? es decir, mi 'init' se llama en el mismo hilo que luego llamará a los métodos java estáticos. – weston
Utilice siempre el puntero 'JNIEnv' que está entrando en la función C. Como en mi último ejemplo. – maba
Por favor, vea mi edición, en su ejemplo, si 'Java_package_Class_method' llamó' someCallback', no necesitaría ir a través de 'JavaVM' ¿o sí? En efecto, esto es lo que estoy haciendo, simplemente usando un global en lugar de pasarlo a 'someCallback'. – weston