IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[JNI] Problème classloader


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 3
    Par défaut [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 !

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 3
    Par défaut
    Le problème venait du fait que le JNIEnv dans la dll c était enregistré en local lors du premier appel d'initialisation. Or l'initialisation et les appels futurs se faisaient dans deux threads différents du point de vue de java. Et la spec JNI indique bien qu'un JNIEnv n'est valable que pour un thread donné :
    http://java.sun.com/j2se/1.5.0/docs/...n.html#wp16696

    Le JNIEnv restait correct (par exemple la fonction GetVersion fonctionnait toujours) mais le FindClass ne fonctionnait plus, probablement à cause d'un problème de classloader comme évoqué dans mon premier message.

    La solution a donc tout simplement consisté a faire transiter le JNIEnv à chaque appel, ainsi plus besoin de se soucier du thread appelant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JNI] Problème SWIG java.lang.UnsatisfiedLinkError
    Par Julien.M dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/09/2007, 16h15
  2. [JNI] Problème dû aux threads Java
    Par seiryujay dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/11/2006, 13h14
  3. [JNI]Problème de package avec jni
    Par picomz dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 10/08/2006, 15h43
  4. [JNI] Problème à l'exécution
    Par Guldin dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 20/02/2006, 09h28
  5. [JNI]problème option -Djava.library.path
    Par sylviiie dans le forum ANT
    Réponses: 2
    Dernier message: 18/05/2004, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo