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 :

Problème JNI : UnsatisfiedLinkError maFonction


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème JNI : UnsatisfiedLinkError maFonction
    Bonjour,

    Cela fait pas mal de temps que je planche sur le problème JNI qui suit et j’ai épuisé mes idées et celles que j’ai trouvées sur le net.

    Je développe un programme en Java qui, grâce une classe Personnalisation, interroge la base de registre Windows via JNI. Le Programme s’exécute normalement sous ma plateforme de développement (sous Windows Xp).
    Voici la déclaration des fonctions du .h généré avec javah:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class ap_Personnalisation */
     
    #ifndef _Included_ap_Personnalisation
    #define _Included_ap_Personnalisation
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     ap_Personnalisation
     * Method:    TrouverComptes
     * Signature: (Ljava/lang/String;)Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_ap_Personnalisation_TrouverComptes
      (JNIEnv *, jclass, jstring);
     
    /*
     * Class:     ap_Personnalisation
     * Method:    ModifierCompte
     * Signature: (Ljava/lang/String;Ljava/lang/String;II)I
     */
    JNIEXPORT jint JNICALL Java_ap_Personnalisation_ModifierCompte
      (JNIEnv *, jclass, jstring, jstring, jint, jint);
     
    /*
     * Class:     ap_Personnalisation
     * Method:    TrouverClientPardefaut
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_ap_Personnalisation_TrouverClientPardefaut
      (JNIEnv *, jclass);
     
    /*
     * Class:     ms_common_Personnalisation
     * Method:    TrouverClientsPresents
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_ap_Personnalisation_TrouverClientsPresents
      (JNIEnv *, jclass);
     
    #ifdef __cplusplus
    }
    #endif
    #endif

    Malheureusement, quand je veux l’exécuter sous Windows98, j’obtiens l’erreur suivante :
    UnsatisfiedLinkError TrouverComptes

    A noter que :
    - les fonctions TrouverClientPardefaut et TrouverClientsPresents sont appelées avant TrouverComptes et elles marchent nickel
    - le code de cette dll fonctionne sous l’os car je l’ai testé sous forme d’un .exe
    - j’ai bien vérifié TOUTES les syntaxes
    - j’ai changé les paramètres jstring en jchararray sans succès
    - ModifierComptes pose le même pbm
    - j’ai testé TrouverCompte sans paramètre jstring et cela ne marche pas non plus
    - j’ai bidouillé l’ordre des fonctions …

    Voilà, j’espère que mon explication du pbm est assez explicite. Si quelqu’un a une idée, merci de bien vouloir me la communiquer. Cela m'aiderait beaucoup.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu dois avoir un problème avec les paramètres des méthodes (les méthodes TrouverClientPardefaut et TrouverClientsPresents n'ont pas de paramètres et elles passent bien alors que les deux autres ont des paramètres...)

    Sinon fais voir un bout de code C/C++

    a++

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Salut,

    voici le code C++ texto copier/coller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    JNIEXPORT jstring JNICALL Java_ap_Personnalisation_TrouverClientPardefaut(JNIEnv * env, jclass c)
    {
    	Personnalisation pers = Personnalisation();
    	string client = pers.TrouverClientMessageriePardefaut();
    	return env->NewStringUTF(client.c_str());
    }
     
    JNIEXPORT jstring JNICALL Java_ap_Personnalisation_TrouverClientsPresents(JNIEnv * env, jclass c)
    {
    	Personnalisation pers = Personnalisation();
    	vector<ClientMessagerie *> clients = pers.EnumererClientsMessagerie();
     
    	string retour = "";
     
    	vector<ClientMessagerie *>::iterator iterateurClients = clients.begin(); 
    	for(int i = 0; iterateurClients != clients.end() ; iterateurClients++)
    	{
    		if( i != (clients.size() -1))
    			retour.append((*iterateurClients)->GetNom()).append("##");
    		else
    			retour.append((*iterateurClients)->GetNom());
    		i++;
    	}
     
    	return env->NewStringUTF(retour.c_str());
    }
     
    JNIEXPORT jstring JNICALL Java_ap_Personnalisation_TrouverComptes(JNIEnv *env, jclass , jstring clientMessagerie)
    {
    	// On récupère le param
    	const char * client = env->GetStringUTFChars(clientMessagerie,0);
    	string clientM = client;
    	env->ReleaseStringUTFChars(clientMessagerie,client);
     
    	Personnalisation  * pers = new Personnalisation();
    	pers->SetClientChoisi(clientM);
    	vector<CompteMail *> comptes = pers->RecupererComptes(clientM);
     
    	string retour="";
    	vector<CompteMail *>::iterator iterateurComptes = comptes.begin(); 
    	for(int i = 0; iterateurComptes != comptes.end() ; iterateurComptes++)
    	{
    		retour.append((*iterateurComptes)->GetNomCompte());
    		retour.append("###");
    	}
    	delete pers;
    	return env->NewStringUTF(retour.c_str());
    }
     
    JNIEXPORT jint JNICALL Java_ap_Personnalisation_ModifierCompte(JNIEnv * env, jclass cls, jstring clientM, jstring nomCpt, jint pop3, jint smtp)
    {
    	// retour fonction
    	jint retourFonction;
     
    	// On récupère le clientM
    	const char * client = env->GetStringUTFChars(clientM,0);
    	string clientMes = client;
    	env->ReleaseStringUTFChars(clientM,client);
     
    	// On récupère le nom du compte à modifier
    	const char * cpt = env->GetStringUTFChars(nomCpt,0);
    	string nomCompte = cpt;
    	env->ReleaseStringUTFChars(nomCpt,cpt);
     
    	// On modifie le compte
    	Personnalisation  * pers = new Personnalisation();
    	bool retour = pers->ModifierCompte(clientMes, nomCompte, pop3, smtp);
     
    	// On envoie les données smtp (serveur + port) à Java
    	boolean envoiDonnees = true;
     
    	// Calcul de l'identificateur de "boolean SetPortSmtpOut(int)"
    	jmethodID mid = env->GetStaticMethodID(cls,"SetPortSmtpOut","(I)Z");
     
    	if (mid == 0) 
    	{
    		// Ca a planté !!!
    		envoiDonnees = false;
    		return -2;
    	} 
    	else 
    	{
    		// Tout va bien, l'appel peut aboutir.
    		//jint port = pers->GetPortSmtp();
    		jint port = 564;
    		jboolean retour = false;
    		retour = env->CallStaticBooleanMethod(cls,mid,port);
    		if(!retour)
    			envoiDonnees = false;
    	}
     
    	// Calcul de l'identificateur de "boolean SetPortSmtpOut(String)"
    	mid = env->GetStaticMethodID(cls,"SetPortServeurSmtp","(Ljava/lang/String;)Z");
     
    	if (mid == 0) 
    	{
    		// Ca a planté !!!
    		envoiDonnees = false;
    		return -2;
    	} 
    	else 
    	{
    		// Tout va bien, l'appel peut aboutir.
    		jstring serveurSmtp = env->NewStringUTF(pers->GetServeurSMTP().c_str());
    		jboolean retour = false;
    		retour = env->CallStaticBooleanMethod(cls,mid,serveurSmtp);
    		if(!retour)
    			envoiDonnees = false;
    	}
     
    	// Conclusion
    	if(retour)
    	{
    		if(envoiDonnees)
    		{
    			// Tout est ok
    			retourFonction = 0;
    		}
    		else
    			// L'envoi des données (ou leur màj dan ssm) s'est mal passé
    			retourFonction = -1;
     
    	}
    	else
    	{
    		if(envoiDonnees)
    		{
    			// Modifs comptes non ok et envoieDonnes ok
    			retourFonction = -2;
    		}
    		else
    			// Grosse catastrophe : rien n'a marché!
    			retourFonction = -3;
    	}
     
    	delete pers;
    	return retourFonction;
    }
    Il manque les entêtes (#include bidule.h), mais bon, je ne pense pas que cela soit important.

    Merci pour ton aide. Pour les paramètres des méthodes, je ne vois aps trop ce que cela peut être. Et en plus, j'ai vraiment besoin de passer ces paramètres ... Par contre, comme je l'ai mentionné dans mon premier post, j'ai testé TrouverComptes sans param et cela ne marchait pas non plus ...

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gwen6917
    Par contre, comme je l'ai mentionné dans mon premier post, j'ai testé TrouverComptes sans param et cela ne marchait pas non plus ...
    oups je n'avais pas vu...


    Par contre le paramètre [b]jclass[b] n'a pas de nom ? C'est normal ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JNIEXPORT jstring JNICALL Java_ap_Personnalisation_TrouverComptes(JNIEnv *env, jclass , jstring clientMessagerie)
    Sinon je ne vois pas trop...

    a++

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Sur mon blog, il y a la solution au problème du "UnsatisfiedLinkError"

    http://johannes-fetz.blogspot.com/20...-avec-jni.html

    Cordialement,

Discussions similaires

  1. JNI UnsatisfiedLinkError sur une methode
    Par Alec6 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 16/02/2011, 14h39
  2. Problème JNI et gcc sous Linux
    Par undercrash dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 31/01/2010, 14h34
  3. Problème de UnsatisfiedLinkError avec une DLL
    Par CYFL dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 16/07/2009, 16h29
  4. [JNI] UnsatisfiedLinkError aléatoire
    Par KindPlayer dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/06/2008, 09h23
  5. [JNI] UnsatisfiedLinkError exception
    Par let_me_in dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 20/05/2007, 16h11

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