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

API standards et tierces Java Discussion :

comment utiliser une dll en JAVA


Sujet :

API standards et tierces Java

  1. #1
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut comment utiliser une dll en JAVA
    Bonjour,
    Je travaille sur une logiciel capable de communiquer avec un port COM. Mon client m'a fourni une un fichier dll m'indiquant que je pouvais l'utiliser avec mon programme JAVA, en gros il doit y avoir des fonctions OpenPort, Write... Sauf que je n'ai aucun fichier jar de fourni. Et dans l'exemple qu'il m'ont donné ils utilisent VB. Ma question, est-il possible d'utiliser des fonctions incluses dans un dll en JAVA ? Si oui comment ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Je ne sais pas si j'ai bien compris ton problème mais as tu regardé du côté de JNI et System.loadLibrary() ?
    Tu peux regarder ici par exemple ou

    Bonne journée

  3. #3
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Tu peux aussi voir du coté de JNA https://jna.dev.java.net/

    A+
    Hydraland

  4. #4
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Je vais tester JNA merci.

  5. #5
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Pourrais-tu me donner un exemple de code permettant d'utiliser les fonctions d'une dll ? Parce que j'avoue ne pas avoir bien saisie les expliactions du site https://jna.dev.java.net/#getting_started

  6. #6
    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,


    Il y a un exemple dans l'article sur JNI vs JNA : http://mbaron.developpez.com/javase/jnijna/#LV

    Grosso modo :
    1. Tu définis une interface qui étend l'interface marqueur Library (ou StdCallCallback pour les DLL Win32 qui utilisel a convention StdCall).
    2. Tu y définis les méthodes de ta DLL (même nom, et type de retour/paramètre correspondant). La plupart des type de base sont géré, mais si ta librairie utilise des structures / objets C++ ca risque d'être plus complexe.
    3. Tu utilises la méthode Native.loadLibrary() en lui passant le nom de ta DLL et le type de ton interface pour obtenir une implémentation de l'interface qui utilise les méthodes natives.



    a++

  7. #7
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Voici l'exemple que j'ai dans la doc de la dll : l'exempl est codé en VB :
    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
     
    L’utilisation de la DLL se fait par déclaration des appels de fonction de la DLL, puis par des appels 
    standards aux fonctions sous VISUAL BASIC.
    Declare Function OpenPort Lib "MODBUS.DLL" (ByVal NumPort As Long, 
    ByVal Vit As Long, 
    ByVal Parite As Long, 
    ByVal DataBit As Long, 
    ByVal StopBit As Long,
    ByVal TypeCOM as Long) As Long
    Declare Function ClosePort Lib "MODBUS.DLL" () As Long
    Declare Function WriteWord Lib "MODBUS.DLL" (ByVal esclave As Long,
    ByVal Adresse As Long,
    ByRef ptW As Byte,
    ByVal Nombre As Long) As Long
    Declare Function ReadWord Lib "MODBUS.DLL" (ByVal esclave As Long,
    ByVal Adresse As Long,
    ByRef ptR As Byte,
    ByVal Nombre As Long) As Long
    Pouvez-vous m'éclairer pour faire la même chose en JAVA, j'ai bien été voir à l'adresse que tu m'as indiqué adiGuba mais ya trop de chose ambigue.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je ne peux pas vérifier sur place mais je dirais que ca ressemblerait à ca en suivant le getting started du premier site:
    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
     
    import com.sun.jna.Library;
    import com.sun.jna.Native;
     
    public interface Modbus {
        public Modbus INSTANCE = (Modbus)
                Native.loadLibrary("MODBUS",
                                   Modbus.class);
     
        public long OpenPort(
            long numPort,
            long vit,
            long parite,
            long dataBit,
            long stopBit,
            long typeCOM
        );
     
        // ... autres methodes de l'interface
    }
    Ceci dit je n'ai jamais utilisé JNA et je peux ne pas avoir bien compris

    [EDIT]imports ajoutés[/EDIT]
    Dernière modification par Invité ; 05/06/2008 à 17h08.

  9. #9
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Tu déclares un type ModBus, le problème justement c'est que je n'ai pas de classe ModBus !

  10. #10
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Merci tu m'a quand même mis sur la piste.
    J'ai codé ça :
    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
     
    public class HelloWorld {
     
        public interface CLibrary extends Library {
            CLibrary INSTANCE = (CLibrary)
                Native.loadLibrary((Platform.isWindows() ? "modbus" : "c"),
                                   CLibrary.class);
     
            long OpenPort(long numPort, long vit, long parite, long dataBit, long stopBit, long typeCOM);
        }
     
        public static void main(String[] args) {
            long toto = CLibrary.INSTANCE.OpenPort(1, 9600, 1, 8, 1, 1);
            System.out.println(toto);
     
        }
    }
    Et ça me renvoie une valeur, qui ne veut rien dire d'ailleurs, mais s'il lance la fonction c'est qu'il doit la trouver dans la dll. Donc c'est cool.

  11. #11
    Invité
    Invité(e)
    Par défaut
    ben Modbus est l'interface que je déclare ici...
    Ensuite comme dit dans le tuto dans une autre classe tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class MaClasse {
        public static void main(String[] args°){
            long toto = Modbus.INSTANCE.OpenPort(/* tes arguments */);
        }
    }
    Pour ce qui est ensuite des paramètres par référence des autres fonctions regarde là : https://jna.dev.java.net/javadoc/com...Reference.html
    comme écrit dans le getting started :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Original C declaration
    void allocate_buffer(char **bufp, int* lenp);
     
    // Equivalent JNA mapping
    void allocate_buffer(PointerByReference bufp, IntByReference lenp);
     
    // Usage
    PointerByReference pref = new PointerByReference();
    IntByReference iref = new IntByReference();
    lib.allocate_buffer(pref, iref);
    Pointer p = pref.getValue();
    byte[] buffer = p.getByteArray(0, iref.getValue());

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Tanebisse Voir le message
    Merci tu m'a quand même mis sur la piste.
    J'ai codé ça :
    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
     
    public class HelloWorld {
     
        public interface CLibrary extends Library {
            CLibrary INSTANCE = (CLibrary)
                Native.loadLibrary((Platform.isWindows() ? "modbus" : "c"),
                                   CLibrary.class);
     
            long OpenPort(long numPort, long vit, long parite, long dataBit, long stopBit, long typeCOM);
        }
     
        public static void main(String[] args) {
            long toto = CLibrary.INSTANCE.OpenPort(1, 9600, 1, 8, 1, 1);
            System.out.println(toto);
     
        }
    }
    Et ça me renvoie une valeur, qui ne veut rien dire d'ailleurs, mais s'il lance la fonction c'est qu'il doit la trouver dans la dll. Donc c'est cool.
    c'est un copier/coller malheureux ou dans ton code tu n'as pas non plus remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Platform.isWindows() ? "modbus" : "c")
    par
    Dans l'exemple il vérifie la plateforme car le nom de la librairie n'est pas le même sous windows et linux. ici le nom de ta librairie est "modbus.dll" si j'ai bien compris.
    Ensuite pour l'interface Modbus j'aurais pu l'appeler Toto ou tout autre nom de mon choix, vu que tu la définis par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public interface MonInterfaceAMoi {...}

  13. #13
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Merci pour les précisions sur ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Platform.isWindows() ? "modbus" : "c")
    Pour le reste j'avais compris ;-)
    Il est possible que je refasse appel à toi au fur et à mesure de mon avancement dans ce projet. Encore merci.

  14. #14
    Invité
    Invité(e)
    Par défaut
    De rien.
    Oublie pas le [RESOLU]

  15. #15
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par George7 Voir le message
    Pour ce qui est ensuite des paramètres par référence des autres fonctions regarde là : https://jna.dev.java.net/javadoc/com...Reference.html
    comme écrit dans le getting started :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Original C declaration
    void allocate_buffer(char **bufp, int* lenp);
     
    // Equivalent JNA mapping
    void allocate_buffer(PointerByReference bufp, IntByReference lenp);
     
    // Usage
    PointerByReference pref = new PointerByReference();
    IntByReference iref = new IntByReference();
    lib.allocate_buffer(pref, iref);
    Pointer p = pref.getValue();
    byte[] buffer = p.getByteArray(0, iref.getValue());
    Bonjour,
    Je me remet dans ce programme après qq semaines, et je ne coomprends pas bien cette notion de paramètre par références. Ci-dessus tu parles des paramètres des autres fonctions, mais desquelles parles-tu ? Je suppose que c'est de ReadWord et WriteWord, car en effet j'ai un soucis par rapport aux paramètres ptW et ptR de ces deux fonctions. Ceux-ci doivent-ils obligatoirement être de type byte ? Ce paramètre est censé représenter l'adresse en mémoire d'un tableau de String, mais je ne vois pas comment faire le lien ?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Salut,
    Pour ce qui est des autres fonctions et des paramètres par référence, par exemplepour cette fonction en VB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Declare Function ReadWord Lib "MODBUS.DLL" (ByVal esclave As Long,
    ByVal Adresse As Long,
    ByRef ptR As Byte,
    ByVal Nombre As Long) As Long
    Je mettrais en Java :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    long ReadWord(
        long esclave,
        long adresse,
        ByteByReference ptR,
        long nombre);
    L'équivalent en C/C++ est surement un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    long ReadWord(
        long esclave,
        long adresse,
        BYTE *ptR,
        long nombre);
    Le truc c'est qu'en C/C++ tu as deux notions de passage de paramétres par valeur et par référence. Un int * en C/C++ peut se traduire par un int[] en Java, ca veut dire en C/C++ l'adresse d'un tableau de int
    J'espèra avoir eclairci ton esprit (ou du moins pas plus embrouillé...)

  17. #17
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    OK, je déclare un ByteByReference pour le paramètre ptR, sauf que cette fonction est censé me mettre un String dans un objet auquel fait référence ce ptR. Et c'est ce lien la que je ne comprend pas. Comment d'un String ou tableau de String je peux récupérer un ByteByReference et vice versa ?

    Voici la doc sur la fonction :

  18. #18
    Invité
    Invité(e)
    Par défaut
    Ah donc c'est même pas une BYTE en C. Vu ce qui est écrit ici https://jna.dev.java.net/javadoc/ove...ml#marshalling, j'essaierais aussi avec un paramètre de type String tout simplement, mais je suis pas sûr. C'est du C++ dans ta dll ?

    EDIT : sinon essaaye avec un char[]
    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    long ReadWord(
        long esclave,
        long adresse,
        char[] ptR,
        long nombre);
    A utiliser comme ca si tu as une chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ReadWord(0,0,machaine.toCharArray(),0);

  19. #19
    Membre actif Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Points : 260
    Points
    260
    Par défaut
    Si je pense que c'est un byte en C, au vue de la doc, mais vu que je ne sais pas ce que contient vraiment la DLL, j'en sais trop rien.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Le tout est de savoir comment est codé byte en C vu que c'est pas un type primitif, c'est peut-être juste un char, ou peut-être pas. Tu as juste ce document et pas la signature C exacte de la fonction ? Tu as essayé mes méthodes? essaye aussi au cas où avec un short[] parce que int16 c'est short en java... Sans plus d'infos je saispas trop quoi te dire de plus désolé

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

Discussions similaires

  1. [C] Comment utiliser une DLL ?
    Par The Lord of Nesquik dans le forum Windows
    Réponses: 1
    Dernier message: 14/05/2006, 12h26
  2. [COM] Comment utiliser une dll DotNet dans un projet win32 ?
    Par Marmottoc dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 05/05/2006, 15h58
  3. [Langage]Comment utiliser une dll .NET dans VB6?
    Par BouB dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/04/2006, 14h20
  4. comment utiliser une DLL win32 en C??
    Par Jayceblaster dans le forum C
    Réponses: 8
    Dernier message: 31/03/2006, 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