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 :

[JNA] Récupération d'une structure C++ en Java


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Administrateur réseau
    Inscrit en
    Mai 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur réseau

    Informations forums :
    Inscription : Mai 2009
    Messages : 58
    Par défaut [JNA] Récupération d'une structure C++ en Java
    Bonjour,

    Je tente de récupérer une structure renseignée par ma fonction en C++, mais je n'arrive pas à faire le Mapping du côté Java pour pouvoir l'utiliser à travers ma DLL.

    Mon programme en C++ s'exécute bien, j'arrive à récupérer les données de ma structure pour les traiter.

    Entete de ma fonction en C++ et la structure que je dois récupérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct donneesGrilleP recupDonneesMNT (const char* fichierDEM, int *tab)
     
    struct donneesGrilleP {
     
    	int longueurCase;
    	int largeurCase;
    	int posXAntenne;
            int posYAntenne;
    	double frequence;
    	double hauteurAntenne;
    	double **tabObstacles;
    };
    Mapping fait du côté Java :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* Interface permettant d'appeler les fonctions de la dll */
    public interface methodesC extends Library {
     
     
    	/* Chargement de la DLL */
    	methodesC INSTANCE = (methodesC) Native.loadLibrary("ParseurDEM", methodesC.class);
     
     
     
    	/* Prototypages des fonctions contenues dans la DLL */
    	structDonneesMNT recupDonneesMNT(String fichier, Pointer[] tabGrille);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class structDonneesMNT extends Structure {
     
    	public int longueurCase;
    	public int largeurCase;
    	public int posXAntenne;
    	public int posYAntenne;
    	public double frequence;
    	public double hauteurAntenne;
    	public PointerByReference tabObstacles;
    }
    A l'exécution de mon programme Java voici l'erreur retournée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  EXCEPTION_UNCAUGHT_CXX_EXCEPTION (0xe06d7363) at pc=0x7569b9bc, pid=1704, tid=5720
    #
    # JRE version: 7.0_02-b13
    # Java VM: Java HotSpot(TM) Client VM (22.0-b10 mixed mode, sharing windows-x86 )
    # Problematic frame:
    # C  [KERNELBASE.dll+0xb9bc]
    #
    # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
    Je ne comprend pas comment interpréter cette erreur. Est-ce possible que le problème vienne de la mauvaise déclaration dans ma structure en Java pour le tableau de double multidimensionnel (public PointerByReference tabObstacles) ?

    Ma version de Java est la 7.1 (JR7)

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Par défaut
    Salut ,

    Je suis aussi en plein dans les DLL, SO avec des structures, des pointeurs, des fonctions pointer dans les structures et j'en passe ^^.

    Alors cette erreur survient fréquemment chez moi aussi.

    C'est tout simplement que ton code Java n'est pas le même que t'as DLL ou SO.
    Alors soit c'est ton code Java qui à un problème ou soit ton code contenu dans la DLL.
    Le JRE détecte le problème car l'allocation mémoire est diffèrenente ->Structure c != structure Java = oui et ben il plante.

    Ici, c'est ton code Java le problème je crois.....

    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
    42
    43
    44
     
    public class Test{
        /* Chargement de la DLL */
        methodesC INSTANCE = (methodesC) Native.loadLibrary("ParseurDEM", methodesC.class);
     
        static {       
            System.setProperty("jna.library.path","chemin/de/ta/librairie"); //Petite astuce qui peut peut-être te servir ;).
        }
     
        /* Interface permettant d'appeler les fonctions de la dll */
        public interface methodesC extends com.sun.jna.Library {
     
                /* Prototypages des fonctions contenues dans la DLL */
            structDonneesMNT recupDonneesMNT(String fichierDEM, int[] tab);
     
            public static class structDonneesMNT extends com.sun.jna.Structure {
                //Si tu veux que ta classes strucutre soit en valeur
                public static class ByDonneesMNT extends structDonneesMNT implements com.sun.jna.Structure.ByValue { };
                public int longueurCase;
                public int largeurCase;
                public int posXAntenne;
                public int posYAntenne;
                public double frequence;
                public double hauteurAntenne;
                public double tabObstacles;//Pas de pointeur en Java... Je suppose que le doubme pointeur fonctionnera de la même façon que le simpe...! 
                //Si tu veux que ta classes structures soit une refenrece
                public static class ByReferenceDonneesMNT extends structDonneesMNT implements com.sun.jna.Structure.ByReference {
                 };
            }
        }
     
        public static void main(String[] args){
            Test test = new Test();
            ByReferenceDonneesMNT donneesMNT = new ByReferenceDonneesMNT();
            donneesMNT.longueurCase = 2;
            /*
            .....
            * 
            */
            int[] a = {1,2,3};
            test.INSTANCE.recupDonneesMNT("plop", a);
        }
     
    }
    Alors voilà pour moi,

    Tu dois mettre dans ton interface "methodesC" tout ce que tu reprends de ta DLL(ce qui te sert) avec exactement les même noms des méthodes, ect.
    Aussi le nom de ton interface doit être le même que le header que tu mappes (Je ne suis pas sur à 100% que c'est obligatoires, mais au moins c'est clair)

    Le mapping de ta structure doit être dans ton interface aussi.

    Le chargement de la librairie doit être en-dehors de ton interface parce quand tu charges la librairie, il va se demander ce que c'est et à quoi ce la correspond "Native....".

    Pour les pointeurs, il les prend tranquille sans se poser de question mais bon j'ai pas encore eu le cas avec le double pointeurs...

    Sinon quand tu as des soucis avec JNA, tu commences par une petit DLL avec juste tes simples données et après tu grossis ta DLL tant que ça marche.

    Voilà, j'espère que je me suis bien exprimé et je suis compréhensible.

    Bon vu que cela fait un moi, je suppose que tu as déjà trouvé la solution ^^.

    Bonne chance,

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Par défaut
    Bonjour c'est pas un élément de réponse sauf que je voici mon problème.

    je travaille sur un projet de modélisation et la 1ère partie consiste à partir du code source existant en "c", écrire un programme JAVA qui permettra de récupérer les informations nécessaires telles que:Structures, Fonction et arguments qui seront exploitable par la suite.

    dans un premier temps mon souci c'est de les récupérer et les afficher. la question de comment les afficher principalement sous forme de classe en java, si vous pouvez aussi me donner des éléments de réponse ce sera avec plaisir.à savoir quel API java permet de le faire, ou, existe t-il un code déjà réalisé par quelqu'un d'autre?

    Merci!

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Par défaut
    Salut,

    Tu connaîtras les structures et les fonctions à l'avance quand même? :p

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Par défaut
    Oui pas de soucis sur ce point!

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Par défaut
    Donc tu cherches comment faire des structures, des appelles de fonction à partir d'une librairie dynamique comme ici au-dessus? Parce qu'il y a déjà quelques trucs intéressant.

    Maintenant, je peux te refaire un exemple d'une structure et des fonctions pour manipuler la structure en c et faire appel à JNA pour les utiliser en Java...

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Par défaut
    en fait j'ai installer CDT environnement (c/c++) sous eclipse car c'est mon ide.

    donc là j'ai crée un projet c contenant des structures, type énuméré, fonctions.
    ce que je veux c'est ecrire un code java qui permettra de recupérer ces informations (structures, fonctions, enumération) contenu dans mon fichier c et les afficher.

    j'espère être claire!

    merci!

Discussions similaires

  1. Récupération d'une structure dans Excel
    Par atakafi dans le forum EPM (Hyperion)
    Réponses: 1
    Dernier message: 26/11/2012, 10h32
  2. Une structure d’arbre en java
    Par bilred dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/04/2009, 11h03
  3. Réponses: 11
    Dernier message: 15/10/2008, 10h44
  4. Probleme avec la récupération d'une structure d'une dll
    Par onaipadesmickey dans le forum MFC
    Réponses: 1
    Dernier message: 26/02/2008, 18h32
  5. Récupération d'une liste de structures Oracle via Java
    Par MagikMarcel dans le forum Langage
    Réponses: 2
    Dernier message: 29/06/2006, 16h34

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