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] Java ne trouve pas mes méthodes natives


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 22
    Points : 11
    Points
    11
    Par défaut [JNI] Java ne trouve pas mes méthodes natives
    Bonjour,
    Je suis en train de réaliser une application java fonctionnant sous Tomcat et qui a besoin d'appeler des méthodes en C. Pour cela, j'utilise JNI.
    J'ai suivi le protocole de création à la lettre (création de la classe java, création de l'entete.h via javah, de la librairie dll, etc...) mais lorsque j'exécute mon application j'ai cette erreur :

    java.lang.UnsatisfiedLinkError: no Structure in java.library.path
    java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491)
    java.lang.Runtime.loadLibrary0(Runtime.java:788)
    java.lang.System.loadLibrary(System.java:834)
    serveur.Structure.<clinit>(Structure.java:15)
    serveur.Servlet_sem.doPost(Servlet_sem.java:90)

    serveur.Servlet_sem.doGet(Servlet_sem.java:37)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    Dans mon répertoire \WEB-INF\classes\serveur d'éclipse j'ai les fichiers suivants :
    * ServletAppel.class
    * Structure.class
    * Structure.c
    * Structure.h
    * Structure.obj
    Et dans mon répertoire \WEB-INF\src\serveur, j'ai les fichiers :
    * ServletAppel.java
    * Structure.java

    Que je mette ma librairie Structure.dll dans le répertoire \WEB-INF\classes\serveur ou dans le répertoire \WEB-INF\classes j'ai toujours la même erreur (celle d'en haut) qui est levée lorsque je fais appel au constructeur "Structure()" dans ma servlet "ServletAppel".

    Mais lorsque je met ma dll dans le répertoire WINDOWS\system32, l'erreur que j'obtient est :
    java.lang.UnsatisfiedLinkError: svc
    serveur.Structure.svc(Native Method)
    serveur.Servlet_sem.doPost(Servlet_sem.java:62)
    serveur.Servlet_sem.doGet(Servlet_sem.java:37)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    et elle est n'est plus levée lors de l'appel du constructeur mais lors de l'appel à ma méthode native "svc()"

    Pourriez-vous me dire s'il y a quelque chose que je fais de mal et si oui, quoi?
    Merci d'avance.

  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,


    Les librairies natives doivent être situé dans un des répertoires de java.library.path, que tu peux obtenir avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String libraryPath = System.getProperty("java.library.path");
    Normalement les répertoires systèmes sont toujours dans java.library.path...



    Sinon pour ton dernier problème : lorsque tu génère l'entête *.h est-ce que tu utilises bien le nom complet de la classe (avec le package, c'est à dire serveur.Structure dans ton cas) ? Sinon le problème vient surement de là...

    a++

  3. #3
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par adiGuba
    Sinon pour ton dernier problème : lorsque tu génère l'entête *.h est-ce que tu utilises bien le nom complet de la classe (avec le package, c'est à dire serveur.Structure dans ton cas) ? Sinon le problème vient surement de là...
    Je suis confronté au même problème que carotte31 et je ne comprend pas ce que tu veux lui dire. Il faut nommer le fichier *.h par le nom_du_package.nom_ de_la_classe ?

    De toute facon j'ai essayé et ca ne fonctionne pas chez moi.

    Est-ce que, si tu n'as pas trop la flèm, tu pourrais m'expliquer en détail où placer tous les fichiers et comment les nommer afin que je parte sur de bonnes bases.

    Merci d'avance
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  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
    Salut,

    Citation Envoyé par danyboy85
    Je suis confronté au même problème que carotte31 et je ne comprend pas ce que tu veux lui dire. Il faut nommer le fichier *.h par le nom_du_package.nom_ de_la_classe ?
    Non je parle de l'utilisation de Java. Si ta classe Test fait partie d'un package com.monsite par exemple, tu dois utiliser javah de la manière suivante :
    Et pas ceci :
    a++

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 4
    Points
    4
    Par défaut java.library.path
    il suffit de rajouter dans la variable d'environnement "path" le chemin du répertoire contenant la librairie. (j'ai du rebooter avant qu'elle ne soit prise en compte)
    clique droit sur le poste de travail -> propriété -> avancé -> varibles d'env
    sélectionner "path" -> modifier
    ajouter un delimiteur ; à la fin, puis ajouter le chemin du repertoire contenant la librairie.
    ok ok ok ok ok ok ok
    dans l'invite de commande : set (permet d'afficher les var d'env) pour verifier si path contient bien notre nouveau chemin à la fin

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    tu n espas oblige de rajouter le chmin vers ta librairie dans le path, tu peux ecrire un petit bout de code static qui va charger ta librairie a la premiere utilisation de la classe avec la commande loadLibrary

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.loadLibrary("HelloWorld.dll");
    si elle est dan sle dossier de ta classe ou en mettant directement le chemin de la librarie.

    J avais fait de l interfacage java-C-Fortran et ca marchait tres bien pour peu que les choses avait bien ete genere et definies!

Discussions similaires

  1. Tomcat ne trouve pas mes servlets
    Par squeezen123 dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 29/05/2008, 20h43
  2. Réponses: 2
    Dernier message: 03/12/2007, 10h28
  3. Trouve pas mes classes sur le serveur de production
    Par batataw dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 22/09/2007, 12h01
  4. Réponses: 2
    Dernier message: 31/07/2007, 14h12
  5. Javac ne trouve pas mes autres packages
    Par bibx dans le forum ANT
    Réponses: 1
    Dernier message: 17/08/2006, 10h34

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