Je travaille dans l'API JNI Invocation, en appelant Java depuis C. J'ai une initialisation initiale pour mettre en cache plus de 30 classes Java dans des références globales. Les résultats de FindClass sont transmis à NewGlobalRef pour acquérir une référence globale à la classe. Je cache ces variables de classe pour les réutiliser plus tard. J'ai plus de 30 références globales aux classes (et plus de 30 methodID globaux pour les constructeurs de classe).Les variables de référence globales jclass mises en cache par JNI sont-elles récupérées?
Dans l'exemple suivant, j'ai supprimé la gestion des exceptions ainsi que l'invocation JNI dans le but de raccourcir l'extrait de code. Mon code de travail a des vérifications d'exception après chaque appel JNI et je cours avec -Xcheck: jni. Voici l'extrait:
jclass aClass;
jclass bClass;
jmethodID aCtor;
jmethodID bCtor;
void getGlobalRef(const char* clazz, jclass* globalClass)
{
jclass local = (*jenv)->FindClass(jenv,clazz);
if (local)
{
*globalClass = (jclass) (*jenv)->NewGlobalRef(jenv,local);
(*jenv)->DeleteLocalRef(jenv,local);
}
}
methodID getMethodID(jclass clazz, const char* method, const char* sig)
{
return (*jenv)->GetMethodID(jenv,clazz,method,sig);
}
void initializeJNI()
{
getGlobalRef("MyProj/Testclass1", &aclass);
getGlobalRef("MyProj/Testclass2", &bclass);
.
.
aCtor = getMethodID(aclass,"<init>","()V");
bCtor = getMethodID(bclass,"<init>","(I)V");
}
La fonction initializeJNI() définit les références globales pour jclasses et les ID de méthode pour les constructeurs, ainsi que certains de jfieldID et une initialisation des structures de données C. Après l'initialisation, lorsque j'appelle une fonction JNI en utilisant certaines jclasses et ctor jmethodID en cache, j'obtiens un mauvais appel de référence global ou local rapporté par -Xcheck: jni.
Dans gdb, je casse à la dernière ligne d'initializeJNI() et j'imprime toutes les classes j et jmethodID et celles qui causent des problèmes ont été transformées en garbage ou garbage-collected (par exemple 0x00 ou 0x06). Est-il possible de créer des références globales?
Des suggestions?
Résolu. Corruption de données dans C. Aucune erreur JNI. – bubbadoughball