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

Java Discussion :

Appeler une Dll (en c++) en Java


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut Appeler une Dll (en c++) en Java
    Bonjour,
    Je suis à la recherche de tutos, exemples expliquants comment appeler dans une classe java une fonction présente dans une dll ecrite en c/c++.
    Ce qu'il faut savoir :
    - j'ai la dll, mais pas le code.
    - ma version de java est 1.5.
    - la fonction que je désire appelée dans la dll prend en argument une structure (contenant des doubles, des longs et des tableaux de double) -> donc je suppose qu'il me faut un objet java correspondant à cette structure en c !!?
    - OS : windows 2003.
    - IDE : WSAD 5.1.

    Merci pour votre aide.
    salut.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    En gros il faut que tu fasses un wrapper qui va appeler la fonction de la DLL, avec JNI tu commence par faire une classe Java qui contient une méthode déclarée "native", ensuite tu utilise javah pour générer le header de la fonction C++ correspondante et tu l'implémente en appelant la DLL.

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu peux également utiliser une librairie externe comme JNA.

    Pour avoir une idée tu peux jeter un coup d'oeil à ce billet : JNI pour les Nuls... ou JNA pour faire plus simple !


    a++

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    OK, Merci,
    JNA me semble assez acessible ! je vais essayer d'explorer cette méthode.
    je vous tien au courant.
    merci encore.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    Bonjour,
    après une lecture rapide de la doc de JNA, j'ai commencé à coder, tout se passe bien jusqu'à l'éxecution !?
    je pense avoir réussi à appeler la fonction C++ dans la DLL puisque j'ai l' exception C++ suivante : DAMAGE after Normal Block (#79) at 0x00972540 !!!!
    il parait que cette exception est lancé dans le cas ou :
    - on alloue de la mémoire pour un tableau
    - on déborde sur le tableau (exp : malloc(tab(10)) puis, tab[11] = x) (ne faites pas gaffe au code :-))
    - on libère la mémoire exp : free.
    c'est au moment du free que l'exception est lancée !!
    Sauf que moi j'ai pas le code de ma Dll !!!! néanmoins, je pense que c'est due aux tableaux que je passe à la fonction ! plus précisement au format !!!
    j'explique :
    mon exemple fonctionne correctement avec une feuille excel qui appelle la dll comme ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public Donnees_Excel As S_Lissage
    Call Interface(Donnees_Excel)
    avec :

    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
     
    Public Const Rmax As Long = 100
    Public Const Resmax As Long = 500
    Public Const Echmax As Long = 80
    Public Const Nmax As Long = 1000
    Public Const MaxClause As Long = 20
    Public Const Results As Variant = "Interpolation_Results"
    Public Const yield As Variant = "Yield Curve"
    Public Const Graph1 As Variant = "Graphic_YieldCurve"
    Public Const fwd_res As Variant = "Forward_Results"
     
     
    Public Type S_Lissage
        taille_Input As Long
        taille_Output As Long
        lambda As Double
        VecMat(1 To Echmax) As Double
        VecYield(1 To Echmax) As Double
        VecDates(1 To Resmax) As Double
        VecQ(1 To Resmax) As Double
    End Type
    de mon coté en java, je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Lissage val = new Lissage();
    lib.Interface(val);
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import com.sun.jna.*;
     
    public class Lissage extends Structure {
    		public long taille_Input;
    		public long taille_Output;
    		public double  lambda;
    		public double[]  VecMat = new double[80];
    		public double[]  VecYield = new double[80];
    		public double[]  VecDates = new double[500];
    		public double[]  VecQ = new double[500];
    	}
    mes deux structures (en java et vb) ne sont surement pas pareilles pour ma dll puisque ça fonctionne pour l'une et plante pour l'autre !
    merci de m'aider, d'autant plus que je suis null en excel, et je n'ai même pas les sources de la dll pour débuguer !

Discussions similaires

  1. Erreur lors de l'appel d'une DLL en C depuis Java
    Par rinuom dans le forum Général Java
    Réponses: 1
    Dernier message: 30/04/2012, 19h23
  2. [JNI] Appeler une DLL Fortran à partir de Java
    Par Graffity dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 13/11/2008, 00h07
  3. Réponses: 12
    Dernier message: 23/05/2007, 21h40
  4. Réponses: 17
    Dernier message: 27/04/2007, 11h06
  5. Appeler une Dll ActiveX VB avec C++
    Par alexorel dans le forum C++
    Réponses: 1
    Dernier message: 06/09/2006, 15h56

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