[JNI] Problème classloader
Bonjour,
J'ai un thread java qui charge une dll C (un wrapper) qui elle même charge une seconde dll en C :
Thread Java -> Dll Wrapper C -> Dll C
J'appelle une fonction dans la dll wrapper depuis java en JNI, cette fonction dans le wrapper appelant elle même la fonction cible dans la dll C. Jusque là tout va bien.
Mais j'ai un problème lorsque j'essaie de charger une classe Java dans le code C. Quand je fais un FindClass dans la dll Wrapper C, tout va bien, je peux instancier la classe et l'utiliser. En revanche quand j'essaie la même opération dans la dll C, cela ne fonctionne pas. J'ai passé de deux manières le JNIEnv à cette dll c : par envoi par paramètre du JNIEnv connu de la dll wrapper C, et par appel à la fonction JNI_GetCreatedJavaVMs. Dans les deux cas le JNIEnv obtenu est valide car un appel à la fonction GetVersion retourne bien 00010004 (j'utilise le JDK 1.4.2_12). Par contre le FindClass retourne systématiquement NULL (la classe recherchée est ok, car le même FindClass dans la dll wrapper c fonctionne)
J'ai alors fait des recherches dans la doc sun (http://java.sun.com/j2se/1.4.2/docs/...tml#FindClass). Il est indiqué que dans le JDK 1.1, la variable d'environnement CLASSPATH était utilisée pour retrouver les classes, mais que depuis la version 1.2, le classloader associé à la méthode native courante est utilisé. Or il semble que mon problème vient de là. En effet la méthode appellée dans dll wrapper c est bien native, par contre la méthode dans dll c, bien qu'elle ai une instance de JNIEnv, n'est pas native, et ne doit donc par conséquent pas avoir de classloader associé. De ce fait les FindClass ne fonctionnent pas.
Je précise que tout fonctionne dans le même Thread, il n'y a donc pas de problème d'appel à AttachCurrentThread.
Quand je transforme la dll c en exécutable indépendant, et que j'instancie ma propre JVM avec JNI_CreateJavaVM, le FindClass fonctionne. Or il semble que je ne peux pas faire un JNI_CreateJavaVM dans la dll c car une JVM provenant du thread java appelant existe déjà (lorsque j'ai essayé cela posait des problèmes)
Quelqu'un peut il m'aider ? (Par exemple : peut on rattacher un classloader à la dll c ?)
Merci d'avance !