En gardant une référence mondiale pour la JNIEnv environnement
Je suis le stockage hors JNIEnv
mondial pour que je puisse appeler statique méthodes de java plus tard. Mais est-il nessasary pour stocker hors d'un pointeur global de la JNIEnv
, ils comme on le ferait avec tout autre objet java, ou est-il un cas particulier qui ne nécessite pas de cette.
JNIEnv* globalEnvPointer;
[JNICALL etc] void init(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
}
Modifier
Je suis bing un peu stupide ici, toutes les méthodes qui leur permettront d'utiliser globalEnvPointer
, sont invoqués dans mon init parce que mon init
est en fait mon c
du programme main
méthode, qui ne reviendra pas jusqu'à la fin du programme. Je suis également en utilisant aucun autre thread dans la partie c du programme. Je pense que cela simplifie la réponse.
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
}
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas mettre en cache les
JNIEnv
pointeur. Lire à ce sujet ici:Ce que vous pouvez faire est de mettre en cache les
JavaVM
pointeur à la place.Et puis quand vous en avez besoin alors
JNIEnv
pointeur d'un contexte où il n'est pas donné pour ce faire:Mais à chaque fois que vous appelez une méthode native de Java env pointeur à utiliser est donnée:
init
est appelé dans le même thread que qui fera plus tard appeler la statique méthodes de java.JNIEnv
pointeur qui est à venir dans la fonction C. Comme dans mon dernier exemple.Java_package_Class_method
appelésomeCallback
, vous n'auriez pas besoin de passer parJavaVM
feriez-vous? En effet c'est ce que je fais, juste à l'aide de l'échelle mondiale plutôt que de les passer àsomeCallback
.c
base de la source et de réécrire 100+ assemblée des méthodes en java (commesomeCallback
). Nous parlons de quelques milliers de places ont été invokations sont effectuées. En Plus de la même source de la base doivent toujours compiler pour la cible d'origine, donc en passantJNIEnv
autour de est en fait le laid solution. Merci pour tous les conseils, je vais bare à l'esprit, si j'ai besoin d'utiliser des threads.