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] Union - Problème entre L'union C et en Java


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    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
    Points : 122
    Points
    122
    Par défaut [JNA] Union - Problème entre L'union C et en Java
    Bonjour à tous,

    Je viens encore une fois vers vous car j'ai des soucis avec les unions entre le c et Java.

    Donc voici une peu de code :

    Le Header
    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
     
    #ifndef TESTSTRUCT_H_INCLUDED
    #define TESTSTRUCT_H_INCLUDED
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef int         INT32;
    typedef unsigned int   UINT32;
     
    typedef union {
    	INT32  i;
    	UINT32 u;
    	float  f;
    	char  *s;
    } Value;
     
    void plop(Value *value);
    void plopFloat(Value *value);
    void plopString(Value *value);
    #endif // TESTSTRUCT_H_INCLUDED
    Le point c.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "TestStruct.h"
     
    void plop(Value *value){
        printf("\n\n plop value : %d \n", value->i);
    }
     
    void plopFloat(Value *value){
        printf("\n\n plop float : %f \n", value->f);
    }
    void plopString(Value *value){
        printf("\n\n plop string : %s \n", value->s);
    }
    Et la classe java :
    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
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    public class StructureJna {
     
        static {       
            System.setProperty("jna.library.path","Libraries"); 
        }
     
        private MyLibrary lib ;
     
        public StructureJna(){
            lib = (MyLibrary) Native.loadLibrary("Structure",Platform.isWindows() ? MyWin.class : MyLibrary.class);
        }
     
        public MyLibrary getLib() {
            return lib;
        }
     
        public interface MyLibrary extends com.sun.jna.Library {
     
            void plop(Value value);
            void plopFloat(Value value);
            void plopString(Value value);
     
            public static class Value extends com.sun.jna.Union{
                public int i;
                public int u;
                public float f;
                public String s = null;
                public static class ByValue extends Value implements com.sun.jna.Union.ByValue{ };
            }
        }
     
        public interface MyWin extends MyLibrary{}
     
            public static void main(String[] args){
     
            StructureJna s = new StructureJna();
     
            Value value = new Value();
            value.i = 5;
            s.getLib().plop(value);
     
            Value valuef = new Value();
            valuef.f = (float) 0.4;
            s.getLib().plopFloat(valuef);
     
            ByValue values = new StructureJna.MyLibrary.Value.ByValue();
            values.s = "salut";
            s.getLib().plopString(values);
        }  
    }
    Reponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     plop value : 0 
     
     plop float : 0.000000 
     
     plop string : (null)
    Voilà, j'ai essayé en com.sun.jna.union.byvalue, ou com.sun.jna.union.byreference ou sans cela et ben cela ne marche pas.

    J'ai essayé en com.sun.jna.Structure ne marche pas non plus...

    Le code C marche en compilant avec un main en C.

    Donc voilà, est-ce que quelqu'un a déjà fait un Union en JNA ou si connait.

    Merci à vous .

  2. #2
    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 ne faudrait pas utiliser le type com.sun.jna.Pointer pour le char* ?


    a++

  3. #3
    Membre régulier
    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
    Points : 122
    Points
    122
    Par défaut
    Salut,

    Non, pas de souci pour lui .

    char* = String .

  4. #4
    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
    Je viens de voir ceci :
    https://github.com/twall/jna/blob/ma...esAndUnions.md

    Unions are generally interchangeable with Structures, but require that you indicate which union field is active with the setType method before it can be properly passed to a function call.
    Donc je suppose qu'il faudrait faire quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Value value = new Value();
    value.setType(int.class);
    value.i = 5;
    s.getLib().plop(value);


    a++

  5. #5
    Membre régulier
    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
    Points : 122
    Points
    122
    Par défaut
    Oui, cela fonctionne à merveille .

    Il fallait bien préciser le type qui n'est pas si bête que ça pour une union ^^.

    je vous remercie .

    Topique Résolu !

  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
    Oui c'est bon à savoir (perso d'habitude je ne manipules que des types de bases, donc pas de struct ni union..).


    Sinon perso (encore) j'ai une préférence pour le "Direct Mapping", qui donne un code plus propre que les interfaces qui étendent com.sun.jna.Library :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MyLibrary {
     
    	static {
    		Native.register("Structure");
    	}
     
    	public native void plop(Value value);
    	public native void plopFloat(Value value);
    	public native void plopString(Value value);
    }


    a++

  7. #7
    Membre régulier
    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
    Points : 122
    Points
    122
    Par défaut
    Merci, c'est toujours bon à savoir les différentes façon de faire .

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

Discussions similaires

  1. Problème entre order by et Union
    Par pmboutteau dans le forum SQL
    Réponses: 2
    Dernier message: 09/07/2013, 14h49
  2. ACCESS 97, requête union, problème de liaison entre 2 requêtes
    Par AGR26 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/09/2007, 18h00
  3. Réponses: 2
    Dernier message: 15/12/2006, 15h19
  4. [Tableaux] Lister le tableau avec UNION => Problème
    Par tutomania dans le forum Langage
    Réponses: 4
    Dernier message: 25/09/2006, 19h20
  5. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02

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