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 avec javah


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [JNI] problème avec javah
    Bonsoir,

    J'ai besoin d'utiliser l'interface JNI dans le cadre de la réalisation d'une application nécessitant l'accès à des fonctionnalités système.

    En lisant quelques tutoriels sur JNI, j'ai bien compris le principe de son utilisation (définition d'une classe Java contenant une méthode native, sa compilation, la génération du prototype de la fonction C avec l'utilitaire javah, l'implémentation de la fonction C, sa compilation et l'inclusion de la dll dans une bibliothèque partagée).

    En voulant appliquer ces notions sur un exemple facile qui consiste à afficher une chaine de caractères avec la fonction printf() , j'ai eu un problème avec la commande javah et la création du fichier entête n'est pas réalisée.

    voici les classes:
    //ShowMessage.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package javaapplication1;
     
    public class ShowMessage {
     
        native void ShowMessage(String msg);
        static{
            System.loadLibrary("MsgImpl");
        }
     
    }
    //main.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package javaapplication1;
    public class Main {
     
        public static void main(String[] args) {
     
            ShowMessage app = new ShowMessage();
            app.ShowMessage("Generated with JNI");
        }
     
    }
    Et voici le message d'erreur qui s'affiche en tapant cette commande
    javah -jni ShowMessage
    dans l'invite de commandes.

    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
    C:\Users\Mehdi\Documents\NetBeansProjects\JavaApplication1\build\classes\javaapplication1>javah -jni ShowMessage
    error: cannot access ShowMessage
    bad class file: .\ShowMessage.class
    class file contains wrong class: javaapplication1.ShowMessage
    Please remove or make sure it appears in the correct subdirectory of the classpa
    th.
    com.sun.tools.javac.util.Abort
            at com.sun.tools.javac.comp.Check.completionError(Check.java:164)
            at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:149)
            at com.sun.tools.javadoc.RootDocImpl.<init>(RootDocImpl.java:77)
            at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159
    )
            at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)
            at com.sun.tools.javadoc.Start.begin(Start.java:128)
            at com.sun.tools.javadoc.Main.execute(Main.java:66)
            at com.sun.tools.javah.Main.main(Main.java:147)
    javadoc: error - fatal error
    2 errors
    Quelqu'un a une solution??

    Merci d'avance.

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    je me suis rendu compte d'une erreur, que j'avais oublié de mettre le nom du package auquel appartenaient mes classes lors de l'éxécution de la commande javah -jni .
    Mais il reste encore une erreur !!!
    Celle là ça fait 2 jours que je cherche en vain.

    Voici le nouveau message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C:\Users\Mehdi\Documents\NetBeansProjects\JavaApplication1\build\classes\javaapp
    lication1>javah -jni JavaApplication1/ShowMessage
    javadoc: error - Illegal package name: "JavaApplication1/ShowMessage"
    1 error

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Y'a t'il une personne qui peut m'aider???????

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Salut,

    Je viens d'être confronté à la même erreur, et ton second message m'a fait trouver la solution: tu ne peux exécuter la commande dans le directory où tu te trouve, car il cherche (dans ton cas) la class "JavaApplication1.ShowMessage", donc la class "ShowMessage" dans le dossier "JavaApplication1"

    tu as alors deux solutions pour exécuter ta commande:



    utilise le man de javah pour avoir la description de -classpath et -d
    • -classpath : sert à donner une liste des endroits où chercher les class
    • -d : sert à donner le chemin du directory où mettre le .H généré

    Autrement dit, pour que ta commande marche, tu dois avoir la racine de ta hiérarchie des class (ici le dossier classes) dans ton PATH. Le dossier d'où est lancé la commande y est d'office, d'où les deux manières de faire. Attention, l'option "-d" permet de choisir où se fera la sortie, par défaut, c'est dans le dossier courant, ce qui peut ne pas être pratique.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je m'excuse Aleph pour le retard (j'avais perdu l'espoir de trouver une réponse).
    Je vous remercie pour votre réponse.
    J'ai essayé les 2 méthodes que vous m'avez dites mais elles n'ont pas fonctionné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C:\Users\Mehdi\Documents\NetBeansProjects\JavaApplication10\build\classes\javaapplication10>javah -jni -classpath .:.. -d . JavaApplication10.ShowMessage
    error: cannot access JavaApplication10.ShowMessage
    class file for JavaApplication10.ShowMessage not found
    javadoc: error - Class JavaApplication10.ShowMessage not found.
    Error: No classes were specified on the command line.  Try -help.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C:\Users\Mehdi\Documents\NetBeansProjects\JavaApplication10\build\classes>javah -jni -classpath .:./javaapplication10 -d ./javaapplication10 JavaApplication10.ShowMessage
    error: cannot access JavaApplication10.ShowMessage
    class file for JavaApplication10.ShowMessage not found
    javadoc: error - Class JavaApplication10.ShowMessage not found.
    Error: No classes were specified on the command line.  Try -help.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    As-tu changé le nom de tes class et packages depuis ton premier message?

    parce que sinon, tu as écris "JavaApplication10" au lieu de "JavaApplication1"

    je bosse sur ce genre de code actuellement, et pour le moment, la compilation se passe très bien (j'ai pas encore vérifié que tout tournait comme je voulais, mais ça compile!)

    perso, voici ma commande compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javah -jni -classpath .:..  -d . irxrdDynCLB.diffDynCLB
    qui me permet d'obtenir le .h correspondant à ma class diffDynCLB.class


    ps: tu as bien compilé ton java avant (quelque chose comme
    mais si tu utilise NetBeans, je suppose que la compilation se fait automatiquement, donc pas de problème. Il est nécessaire d'avoir le fichier avec l'extension ".class" pour que "javah -jni" puisse marcher

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ai créé un nouveau projet java qui contient les memes classes et bien sur les meme code parce que j'ai supprimé l'ancien projet .C'est pour ça que c'est écrit JavaApplication10

    Évidemment que j'ai compilé le fichier ShowMessage.java avec NetBeans.

    J'ai exécuté les deux commandes que vous m'avez citées mais ça n'a pas voulu fonctionner.

    Je suis encore en train de chercher la solution à ce problème.
    En attendant de la trouver, je me débrouille .Je crée un fichier nom_classe.java ne contenant pas de package et je le compile pour obtenir le fichie.class puis j'exécute la commande javah -jni.Enfin, je fais une petite modification sur le prototype de la fonction native qui se trouve dans le fichier entête généré en ajoutant le nom du package

    Mais c'est énervant de faire tout ça sachant qu'il existe sûrement une solution simple à ce problème.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Hi,

    dsl que cela ne marche pas!

    c'est effectivement assez agaçant de ne pouvoir automatiser le processus, d'autant que compiler et exécuter un programme sont deux choses différentes, et que l'un n'implique pas l'autre (je compile très bien, mais ne tourne pas encore, d'où un très grand nombre de compilations horaire...).

    Je ne sais pas trop quoi te dire, parce que mon projet compile avec ce que je t'ai dis.

    Si tu veux, envoie moi en MP un zip (ou tar, ou tgz) de ton projet, avec les packages, que je voie si je peux faire quelques chose chez moi, ça sera peut être plus simple.

Discussions similaires

  1. [JNI] problème avec l'utilisation de JNI
    Par nina08 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 01/12/2011, 09h08
  2. Problème avec JNI
    Par m_piou dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 26/03/2010, 09h47
  3. Petit problème avec la JNI
    Par cereal dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 19/06/2007, 09h49
  4. [JNI]Problème de package avec jni
    Par picomz dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 10/08/2006, 15h43
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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