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]appel d'un dll en Java


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut [JNI]appel d'un dll en Java
    Bonjour,
    Je sais que pour communiquer avec un pgm écrit en c++ ou en c on doit passer par JNI.
    Mais, si on a une dll déjà prete comment on va l'utiliser dans un code Java?
    Merci.
    Aida.

  2. #2
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Imaginons une dll HelloWorld.dll contenant la méthode printCpp(). Il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class HelloWorld {
        static { System.loadLibrary("HelloWorld"); }
     
        public static native void printCpp();
     
        public static void main(String args[]) {
            System.out.print("Hello ");
            HelloWorld.printCpp();
        }
    }
    pour appeler la méthode printCpp()

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Oui, je vois mais une petite question si la dll est compilée et je n'ai pas son source est ce que je peux l'utiliser sans se préoccuper du fichier d'en tete s'il existe ou non,???
    Aida.

  4. #4
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Je ne sais pas si c'est possible. Par contre tu pourrais peut-être exécuter une commande shell qui exécuterais la méthode que tu souhaite?.
    C'est vrai que ce serait intéressant de pouvoir utiliser par JNI des méthodes de dll déja compilées mais je ne crois pas que ce soit possible. Si quelqu'un sait comment faire ... :

  5. #5
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Citation Envoyé par Aida
    si la dll est compilée et je n'ai pas son source est ce que je peux l'utiliser sans se préoccuper du fichier d'en tete s'il existe ou non,???
    Il faut que dans ta propre dll, crée à partir de jni, tu fasse appel aux méthodes de ta dll déjà créée. Ta propre dll va faire seulement le lien entre JNI et la dll éxistante.
    Si tu n'as pas le header, il existe les méthodes LoadLibrary/FreeLibrary. Elles sont spécifiques à windows par contre (à vérifier). Demande sur le forum adéquat pour plus de précisions.
    Bonne chance.
    @+

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    Est ce que tu veux dire queje dis créer une dll en c++ qui appelera la dll dont je dispose pas du code source???
    Ou bien que je dois appeler la dll compilée sans se préoccuper du fichier d'en tete??
    Je n'ai pas compris, tu peux clarifier un peu STP??
    Et pour les forums adéquets, que me conseilles tu comme forum???
    Merci d'avance.
    Aida.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Le plus simple c'est donc de récupérer un header pour ta dll existante et écrire une DLL de transition (avec une fonction jni pour chacune des fonction de ta dll) que tu pourra utiliser dans Java.

    Bon courage.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    OUi, mais, on vient de me faire savoir que je peux telecharger une dll en JAVA sans fichier d'entete, mais je ne sais pas comment le faire???
    Aida.

  9. #9
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Tu ne peux pas utiliser directement une dll en java. Il te faut passer par JNI;
    Pour faire cela, tu dois créer ta propre dll. Cette dll sera juste une "interface" ou pour reprendre la formulation de Abalam ( ) "une DLL de transition". Tu ne peux pas faire autrement.
    Ensuite, pour le second problème, celui du header, comme je te l'ai dis il y a un moyen de charger dynamiquement cette dll (dans ta propre dll). Mais de toute facon, il te faudra, d'une manière ou d'une autre avoir accès à la doc de celle-ci. Histoire de savoir quelles méthodes, avec quels arguments appeller
    C'est plus clair?
    @+

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Oui merci.
    J'ai une doc sur les méthodes de la dll, mais lorsque j'ai contacté le proprietaire de la ddl, il m'a dit que je peux appeler la dll directement dans mon code java sans aucun problème, il m'a dit que je dois la charger dans mon code java et appeler par la suite les fonctions, il m'a dit que je dois chercher une fonction en javaqui fera l'affaire, mais je ne trouve pas.
    Et pour cotre réponse, je vois ce que vous voulez dire, mais, vraiment j'essaie d'eviter le c++ pcq je ne programme pas avec, c tt.
    Alors, s'il y a une solution???
    Merci.
    Aida.

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    bonjour

    si le proprietaire de la dll te dit que tu peux charger directement sa dll dans le prog java, ca veut dire qu'il l'a developpe en vue non seulement d'une utilisation normale type C++ je pense mais aussi avec une utilisation avec java par du jni

    Mais j'en doute. Pourquoi ? Puisque pour faire le lien jni entre java et c++, tu commences par declarer ta methode native en java qui appellera la dll, ensuite tu generes l'en-tete de la methode C++ avec le javah de la jdk, cela te donne le squelette de tes methodes C++ contenues dans la dll qui sont appelees par java, cependant le nom de ces methodes C++ est construit a partir :
    - du nom du package dans lequel se trouve le prog java que tu executes
    - du nom de la classe java du prog java que tu executes
    - du nom des methodes natives declarees dans ta classe java
    et le type des methodes egalement : fonction (boolean, string,int) ou procedure (void)

    Donc l'auteur de la dll que tu veux utiliser n'a pas pu anticiper sur les differents noms que tu as pu utiliser pour package,classe,methode java de ton prog java, or si c'est le cas, ca veut dire qu'il faut que tu recherches dans la dll donc que tu aie au minimum la doc et au mieux les sources pour identifier les structures java que l'auteur de la dll a utilise en analysant les noms des methodes ecrites pour etre appelees par des prog java, et tu dois alors te conformer a cette structure de noms pour pouvoir utiliser cette dll directement dans java SI elle a ete prevu pour etre utilisee egalement avec java par du jni, que ce soit au niveau des noms de package, de classes ou de methodes natives java.

    En clair je doute fortement que tu puisse utiliser cette dll directement dans java, donc le mieux a mon avis pour toi :
    - tu as cette dll deja faite avec la doc pour connaitre les methodes de cette dll
    - tu identifies les methodes de cette dll que te sont necessaires pour le prog java
    - suivant l'utilisation que tu veux en faire dans ton prog java, tu declares les methodes natives java correspondant aux methodes de la dll en question
    - tu generes l'en-tete de ces methodes natives par l'outil de la jdk javah
    - tu ecris et developpes une nouvelle dll C++ (ca va etre dur de ne pas passer par de la prog C++ !!!) basees sur le squelette des methodes C++ generees par javah
    - tu vas charger dans cette nouvelle dll, la dll importee dont tu n'as pas les sources
    - dans ta nouvelle dll C++, ces methodes dont tu as genere l'en-tete vont encapsuler les methodes C++ presentes dans la dll importee en s'occupant egalement dans des conversions de types C++/ java (souvent prise de tete au debut quand tu decouvres toutes les manip a faire pour passer par exemple un vector java en C++ ou inversement)

    Donc au final tu as :

    - ton prog java issu d'une classe java dans un package ou non
    - ta dll C++ de transit java/C++ par jni
    - la dll C++ importee

    et donc ton prog java charge la dll C++ de transit jni qui elle-meme charge la dll importee.

    Voila, au debut je pensais que je serais assez clair, mais en relisant je trouve que c'est bien complique tout ce que j'ai dis !!! Enfin j'espere avoir repondu a ta question du mieux possible. En tout cas si j'ai fait des erreurs qu'on me le signale svp pour que j'evite de propager ces erreurs.

    @+

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    D'abord merci beaucoup pour votre réponse.
    Oui, je vois ce que vous vouliez dire on m'a conseillé la meme chose, mais le problème c'est que je ne sais pas appeler une dll en c++, si qqn connait un lien qui peut m'aider je serai reconnaissante.
    Merci une autre fois.
    Aida.

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    essaie sur ce tutoriel : http://lfe.developpez.com/DLL/ , je crois que c'est expliquer comment charger une dll

    ou alors fais une recherche avec des mots cles comme C++ dll charger ou appeler, ca doit bien se trouver dans des tutoriels

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    Mais ça montre juste comment charger une dll en builder c++, moi j'utilise borland alors, j'utilise la meme procedure ou bien non?
    Merci.
    Aida.

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    pour appeler ta dll tu peux créer un projet en c++ (avec l'environnement que tu utilise ) puis tu n'as qu'à faire : ajouter libreries, ou ressources depuis le menu que tu utilise

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonsoir,
    Merci pour votre réponse.
    Mais, si je crée la dll de transition avec Builder c++ est ce que je serais capable de l'interfacer avec java en utilisant JNI????
    Aida.

  17. #17
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Citation Envoyé par Aida
    Mais, si je crée la dll de transition avec Builder c++ est ce que je serais capable de l'interfacer avec java en utilisant JNI????
    Oui, cela ne dépends pas de ton environnement de programmation.
    Voila un exemple, qui devrais t'aider. Imaginons que tu veillle utiliser une dll nommée "autredll" et plus particulièrement une de ces méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fonction(char* uneParametre, int unAutreParametre)
    Commence par créer ta classe java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class TestJNI{
    	public native void appelFonction();
    	static{
    		System.loadLibrary("jnidll");//nom de ta dll	
    	}	
    	public static void main(String[] args){
    		new Test().appelFonction();	
    	}
    }
    Compile et crée le header avec javah. Ensuite dans ta dll (jnidll) tu auras un truc du genre :
    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
     
    typedef int (__stdcall *MYDLLFUNC)(char*,int);//pointeur sur fontion(char*,int) de autredll.dll
    //...
    JNIEXPORT void JNICALL Java_Test_appelFonction(JNIEnv * env, jobject obj){
        HINSTANCE dll;
        MYDLLFUNC methode;
        int resultat;
        if ((dll=LoadLibrary("autredll.dll"))) {//chargement de la dll
            methode = GetProcAddress(dll, "fonction");//chargement de la méthode
            if (methode) {
                resultat = methode("parametre",5);//appel de la méthode
                printf("%s%d","Le resultat est : ",resultat);//traitement          
            }else{
                    printf("Fonction introuvable");
            }
            FreeLibrary(dll);//libération de l'autre dll
        }
        return;
    }
    Voila, voila ...
    Ensuite, il ne te reste plus qu'à faire un tour des tutos sur JNI. Pour pouvoir, par exemple, transferer des données de java vers un autre langage (et inversement).
    Bonne chance.
    @+

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    OUi, c'est ce que j'ai fait, mais je n'arrive pas à appeler la dll externe ou plutot je n'arrive pas à la charger.
    Le code que j'ai fait est:
    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
     
    #include <vcl\vcl.h>
    #include<stdio.h>
    #pragma hdrstop
    #include "windows.h"
     
     
    #include "Main.h"
    //---------------------------------------------------------------------------
    #pragma resource "*.dfm"
    TMainForm *MainForm;
    //---------------------------------------------------------------------------
    typedef long (__stdcall *MYDLLFUNC)(char[]);
    typedef long (__stdcall *MYDLLFUNC1)(long,char[]);
     __fastcall TMainForm::TMainForm(TComponent* Owner)
    	: TForm(Owner)
    { }
    //----------------------------------------------------------------------------
    void __fastcall TMainForm::ButtonClick(TObject *Sender)
    {
      HINSTANCE hinstDLL;
      MYDLLFUNC ImpFuncDLL;
      MYDLLFUNC1 ImpFuncDLL1;
      long iRet;
      long iRet1;
      char *message="-text Bonjour -speaker Thierry_(fr1)";
      if ((hinstDLL = LoadLibraryA("c:\Program Files\Borland\CBuilder3\Projects\euler.dll")))
      { ImpFuncDLL = (MYDLLFUNC) GetProcAddress(hinstDLL,"eulerInit");
        if (ImpFuncDLL)
        { iRet = ImpFuncDLL("c:\Program Files\Borland\CBuilder3\Projects\euler.ini"); }
        else
        { this->Caption="Impossible2"; }
        ImpFuncDLL1 = (MYDLLFUNC1) GetProcAddress(hinstDLL,"eulerRun");
        if (ImpFuncDLL1)
        { iRet1 = ImpFuncDLL1(iRet,message); }
        FreeLibrary(hinstDLL);
      }
      else
      { this->Caption="Impossible1"; }
    }
    //---------------------------------------------------------------------------
    J'ai utilisé Builder c++ 3.0 mais il ne connait pas la dll.
    Merci.
    Aida.
    [ Modéré par vedaer ]
    -> Ajout des balises code
    [ Merci de respecter les Règles du Forum ]

  19. #19
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Citation Envoyé par Aida
    J'ai utilisé Builder c++ 3.0 mais il ne connait pas la dll.
    C'est à dire? Un problème de compilation? Un problème d'éxecution?
    T'es sur que ce n'est pas un problème de path? Essaye de doubler les \ dans le path
    Je ne m'y connais pas assez pour t'aider plus. Sinon, demande sur le forum approprié, c'est désormais plus un problème de C/C++ qu'un problème de java/JNI
    Bon courage.
    @+

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 4
    Points : 5
    Points
    5
    Par défaut appel d'un dll en java
    bonjour,
    oui, en fait ça se compile avec deux warning "comme quoi l'emplacement n'est pas correct", j'ai doublé les slashs, toujours même problème, à vrai dire je ne peux pas acceder à la fonction de la dll, pourquoi je sais pas, ok je vais faire ce que vous m'avez suggéré et surtout merci beaucoup pour ta coopération que j'ai apprécié.
    aida.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [JNI] Appel DLL externe C# en Java
    Par Contrec dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 08/04/2013, 14h16
  2. [JNI] appel de librairie .dll.a
    Par dsryam dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 31/05/2009, 21h31
  3. [JNI] Appeler une DLL Fortran à partir de Java
    Par Graffity dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 13/11/2008, 01h07
  4. [JNI] Remontée d'évenements DLL C++ vers Java
    Par eag35 dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 16/09/2007, 21h53
  5. Accès dll depuis java avec JNI
    Par romano21 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 25/10/2005, 15h53

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