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

ANT Java Discussion :

[Ant][JNI] problème <javah>


Sujet :

ANT Java

  1. #1
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut [Ant][JNI] problème <javah>
    Bonjour,

    dans le cadre d'une application Web, j'ai besion d'utiliser JNI pour interfacer mon application avec une application C++.

    L'utilisation de JNI requiert de nombreuses opérations répétives (compilation des classes Java, complation des classes C++, création des fichiers d'entête C++ , et la création de DLL).

    C'est pour cela que je souhaite automatiser toutres ces opérations en utilisant Ant.

    Pour l'instant j'arive à automatiser la compilation de mes classes Java grâce à la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <javac srcdir="${basedir}/WEB-INF/src/test" destdir="${basedir}/WEB-INF/classes"> 
    </javac>
    Mon problème vient lors de l'automatisation de la génération des fichiers d'entête C++. En lignes de commande, rien de plus simple, je me place à la racine de mon package et je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    javah -jni test.TestJNI //sachant que "test" est le nom du package et "TestJNI" le nom dde ma classe
    mais avec Ant, je n'y arrive pas, j'ai constemment une erreur : "[javah] Error: Class test.TestJNI could not be found."
    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <javah outputFile="TestJNI.h" > 
          <class name="test.TestJNI1"/> 
    </javah>
    Quelqu'un a une idée ?

  2. #2
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Bonjour,

    Arrives-tu, tout dabord, à faire la compilation via une commande DOS?
    Ta classes se trouve bien sous WEB-INF/scr/test?

    Peut etre que dans le cas de javah il ne va pas chercher les classe sous cette directory?

  3. #3
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Ton basedir est bien setté en rapport avec ton chemin de classes ?

    Peut-être as-tu oublié src/

  4. #4
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Citation Envoyé par yolepro
    Arrives-tu, tout dabord, à faire la compilation via une commande DOS?
    Ta classes se trouve bien sous WEB-INF/scr/test?
    Oui ca fonctionne très bien en commande DOS

    Citation Envoyé par yolepro
    Peut etre que dans le cas de javah il ne va pas chercher les classe sous cette directory?
    Oui sûrement mais justement, où va t-il les chercher ? Je n'ai pas de moyen de le savoir (enfin je crois...)

    Citation Envoyé par KiLVaiDeN
    Ton basedir est bien setté en rapport avec ton chemin de classes ?
    Je n'utilise pas "basedir" dans ma commande javah

    Pour résumé, il faudrait que je sache où pointe le <javah> pour aller cherhcer les classes. Une idée ?

  5. #5
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Le basedir est au niveau de ton projet Ant, et donc ton javah se base dessus pour les chemins relatifs

  6. #6
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    J'ai essayé ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <javah outputFile="test_TestJNI.h" > 
            <class name="${basedir}/WEB-INF/src/test/TestJNI1"/> 
    </javah>
    et ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <javah outputFile="test_TestJNI.h" > 
            <class name="${basedir}/WEB-INF/src/test.TestJNI1"/> 
    </javah>
    avec slash et anti-slash, sachant que ${basedir} pointe bien à la racine de mon projet mais rien n'y fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Buildfile: E:\Program Files\eclipse\workspace\JNI\build.xml
        [javac] Compiling 1 source file to E:\Program Files\eclipse\workspace\JNI\WEB-INF\classes
        [javah] ClassArgument.name=E:\Program Files\eclipse\workspace\JNI\WEB-INF\src\test\TestJNI1
        [javah] Error: Class E:\Program Files\eclipse\workspace\JNI\WEB-INF\src\test\TestJNI1 could not be found.
    Pourtant mes .java sont bien situés ici. J'ai même essayé de faire pointé vers mes .class et ca ne fonctionne pas non plus.
    Je sature là...

  7. #7
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    pourquoi TestJNI1 ?

    As-tu regardé le basedir de ton projet Ant ??

  8. #8
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Citation Envoyé par KiLVaiDeN
    pourquoi TestJNI1 ?
    Et pourquoi pas ? C'est le nom de ma classe c'est tout, j'aurai pu l'appeler Toto ou Titi. Je ne pense pas que la présence de chiffres dans le nom des classes pose un problème. Je vais le virer quand même oin sait jamais...

    Citation Envoyé par KiLVaiDeN
    As-tu regardé le basedir de ton projet Ant ??
    Oui je l'ai déjà di il est bon c'est : E:\Program Files\eclipse\workspace\JNI
    et mon projet s'appelle bien JNI.

    Je ne comprend vraiment pas ce qui merde.

    Quelqu'un a un bout de code ant avec un <javah> pour que je compare avec le mien sur la forme ? Ca m'aidera peut-être car c'est la première fois que j'utilise Ant, et javah qui plus est.

  9. #9
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Je demandais ça car tu avais précisé ceci dans ton premier post :

    javah -jni test.TestJNI //sachant que "test" est le nom du package et "TestJNI" le nom dde ma classe
    Quand tu lances ant, tu le lances comment ? En ligne de commande ? Il y a quelque chose de bizarre si il ne retrouve pas ta classe..

    en ligne de commande, je verrais bien quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    e:
    cd "E:\Program Files\eclipse\workspace\JNI"
    ant -buildfile build.xml
    et dans ton build.xml, ton basedir="." ça marche ?

  10. #10
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Quand tu lances ant, tu le lances comment ? En ligne de commande ? Il y a quelque chose de bizarre si il ne retrouve pas ta classe..
    Non je traville sous Eclipse et je lance Ant en faisant un clic droit sur mon fichier build.xml, puis "run as...", puis "Ant build"

    Mais je viens de découvrir quelque chose d'encore plus surprenant.

    J'ai fais un test en pointant vers une classe quelconque du "rt.jar"

    et ca a fonctionné du premier coup !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <javah destdir="${basedir}">
          <class name="com.sun.beans.ObjectHandler"/> 
    </javah>
    et ca bien créé un fichier "com_sun_beans_ObjectHandler.h" à la racine de mon projet car j'ai spécifié comme répertoire de destination ${basedir}

  11. #11
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Et ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <javah destdir="${basedir}">
       <classpath>
          <pathelement location="src/"/>
       </classpath>
       <class name="test.TestJNI1"/> 
    </javah>

  12. #12
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    yyyyyyyyyyeeeeeeessssssss !!!!!!

    Merci KiLVaiDeN tu étais à 2 doigts de la réponse...

    En fait il faut pointer sur les .class et non les .java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <javah destdir="${basedir}">
    	<classpath>
    	        <pathelement location="WEB-INF/classes/"/>
    	 </classpath>
    	 <class name="test.TestJNI"/> 
    </javah>
    Merci encore de ne pas avoir lâché l'affaire

    Bonne fin de journée à toi !

  13. #13
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Ah cool De rien, c'était un peu à tatons quand même J'avais oublié que c'était les .class qui étaient visés

  14. #14
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Tiens au fait pendant que j'y suis,

    lorsque je fais un javah en lignes de commande, la commande est :

    commande que j'ai copiée sur un tuto JNI.

    Avec Ant, je ne précise à aucun endroit ce paramètre "-jni" et pourtant le .h généré est exactemmnt le même.

    2 question me viennent:
    - à quoi sert réelement ce paramètre ?
    - est-il vraiment utile ?

  15. #15
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    -jni
    Causes javah to create an output file containing JNI-style native method function prototypes. This is the default output, so use of -jni is optional.
    Trouvé ici.

  16. #16
    Membre éclairé 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 : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Oui c'est vrai que j'aurai pu penser au site de sun.
    J'étais en train de me battre avec la commande help en lignes de commande

    Allez cette fois je t'embête plus.
    Merci de ton aide

  17. #17
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Tu ne m'embêtes pas, et je suis content de pouvoir aider

    C'est le principe du forum, l'entraide; un jour, peut-être que les rôles seront inversés, c'est ça qui est génial, aider les autres, pour obtenir soi-même de l'aide, ça fait avancer les choses et c'est une démarche saine !

    A+ et bonne journée !

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

Discussions similaires

  1. [JNI] problème avec javah
    Par mehdiba dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 16/03/2009, 16h06
  2. Réponses: 5
    Dernier message: 14/12/2007, 17h53
  3. JNI : à quoi sert le fichier d'entête géneré par javah ?
    Par Belgar dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/06/2007, 17h29
  4. [ant] Appeler javah depuis ant
    Par GLDavid dans le forum ANT
    Réponses: 1
    Dernier message: 10/07/2006, 17h30
  5. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 12h49

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