Erreur JNI: débordement de la table de référence locale 512 entrées

Ma fonction ressemble à celle ci-dessous. Et il est exécuté à plusieurs resockets. À un moment donné, il se bloque à jobject nvarObject = env-> GetObjectField (var1, nvar1) en donnant une erreur Erreur JNI: débordement de la table de référence locale 512 entrées.

Quelqu’un pourrait-il examiner cette question et apporter un éclairage?

Toutes les méthodes JNI qui renvoient un jobject ou une référence d’object similaire créent des références locales dans la table de références. Ces références sont automatiquement nettoyées lorsque vous redonnez le contrôle à la machine virtuelle Java, mais si vous créez de nombreuses références (par exemple, dans une boucle), vous devrez les nettoyer manuellement.

Vous êtes sur la bonne voie en appelant DeleteLocalRef sur la référence cls , mais notez que GetObjectField renvoie également un jobject . Par conséquent, la référence renvoyée doit être supprimée avant de quitter la fonction.

Assurez-vous également de nettoyer toutes les références existantes avant de revenir d’une condition d’erreur!

Une autre façon de procéder: en haut de la fonction que vous appelez en boucle, appelez PushLocalFrame( env, 5 ) et appelez PopLocalFrame(env) avant tout emplacement de la fonction dans laquelle vous revenez. Cela effacera automatiquement toutes les références créées lors de cet appel de fonction. Le deuxième argument est le nombre de références locales que vous voulez dans le cadre – si vous avez besoin de plus de 5 références locales lors de l’exécution de la fonction, utilisez une valeur supérieure à 5.