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] - Pointeur de structure dans une autre structure


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [JNA] - Pointeur de structure dans une autre structure
    Bonjour à tous ,

    Je suis sûr que vous avez tout compris en lisant le titre .

    Je vais vous mettre d'abord le code c et java pour situer d'abord l'endroit de mon problème.

    Ne faites pas attention au commentaire, nom, ect... On me donne un Header que je dois respecter et j'ai juste un peu modifier pour faire de simple test .

    Mon.h
    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
     
     
    #ifndef TESTSTRUCT_H_INCLUDED
    #define TESTSTRUCT_H_INCLUDED
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef signed char INT8;
    typedef short       INT16;
    typedef int         INT32;
    typedef unsigned char  UINT8;
    typedef unsigned short UINT16;
    typedef unsigned int   UINT32;
     
    /*typedef union {
    	INT32  i;
    	UINT32 u;
    	float  f;
    	char * s;
    } Value;*/
     
    typedef struct IoDyn {
    	UINT8 def:1, // io defined
    		init:1;  // when server: value received from client
     
    	//Value value;
    } IoDyn;
     
    typedef struct {
    	UINT8   out:1;   // direction in=0, out=1 (in=server->client; out=client->server)
    	UINT32  ioAddress; // protocol address (TGAM/USC 0x0000ggio (gg=group=1..64; io=1..))
    	UINT8   ioCount;
    	UINT8   ioPerAddress; 
    	UINT8	ioFunction; 
    	IoDyn   *ioDynP;   // !!! Mon problème !!!
    } IoBloc;
     
    // access low level driver functions
    char* DrvTx (IoBloc * rtuDP, UINT8 *txbuf,int txlen);
    #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
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include "TestStruct.h"
     
    char* DrvTx (IoBloc *rtuDP, UINT8 *txbuf,int txlen){
        char* temp = (char*)malloc(sizeof(char)*255);
        sprintf(temp,"\n test %u , %d , %d",rtuDP->ioAddress,rtuDP->out,rtuDP->ioDynP->init);//
        printf("\n\n c %s \n",temp);
        rtuDP->ioAddress = 2;
        return temp;
    }
     
    /*int main (void){
        IoBloc rt;
        rt.ioAddress = 5;
        rt.out = 0x00;
        IoDyn io;
        rt.ioDynP = io;
        rt.ioDynP.init = 0xFF;
        char *temp = DrvTx(&rt,NULL,5);
        printf("%u",rt.ioAddress);
        return 1;
    }*/
    Mtn code java :

    Class contenant mon interface
    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
     
    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 {
     
            public String DrvTx(IoBloc rtuDP,byte txbuf, int txlen);
     
            /*public static interface Value{
                public int i = 0;
                public int u = 0;
                public float f = (float) 0.0;
                public String s = "";
            }*/
     
            public static class IoDyn extends com.sun.jna.Structure{
                //public static class ByIoDyn extends IoDyn implements com.sun.jna.Structure.ByValue { };
    public static class ByReferenceDyn extends IoDyn implements com.sun.jna.Structure.ByReference{};
                public boolean def, init;
               // public String value = Value.s;
            }
     
            public static class IoBloc extends com.sun.jna.Structure{
                //public static class ByIoBloc extends IoBloc implements com.sun.jna.Structure.ByValue { };
    public static class ByReferenceBloc extends IoBloc implements com.sun.jna.Structure.ByReference{};
                public boolean out;
                public int ioAddress = 0;
                public byte ioCount = 0;
                public byte ioPerAddress = 0;
                public byte ioFunction = 0;
                public ByIoDyn ioDynp = new ByIoDyn();
            }
            public interface MyWin extends MyLibrary{}
        }  
    }
    Class contenant le main
    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 Structure {
     
        public static void main(String[] args){
     
     
            StructureJna s = new StructureJna();
     
            ByReferenceBloc ioBloc = new ByReferenceBloc ();
            ioBloc.ioAddress = 5;
            ioBloc.out = true;
            ioBloc.ioDynp.init = true;
     
            System.out.print("\n\n " + s.getLib().DrvTx(ioBloc, ioBloc.ioPerAddress, 5) + "\n");
            System.out.print("\n\n " + ioBloc.ioAddress + "\n");
        }
    }
    Donc voilà mon problème :
    La Structure IOBloc contient un pointeur vers la structure IoDyn.

    Alors Si je ne le mes plus IoDyn en pointeur ou si je ne touche pas à la variable, cela marche mais si je laisse en pointeur, j'ai le droit à une erreur détècté par la JRE :

    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
     
    #
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x662011f3, pid=2332, tid=3264
    #
    # JRE version: 6.0_25-b06
    # Java VM: Java HotSpot(TM) Client VM (20.0-b11 mixed mode, sharing windows-x86 )
    # Problematic frame:
    # C  [Structure.dll+0x11f3]
    #
    # If you would like to submit a bug report, please visit:
    #   <a href="http://java.sun.com/webapps/bugreport/crash.jsp" target="_blank">http://java.sun.com/webapps/bugreport/crash.jsp</a>
    # The crash happened outside the Java Virtual Machine in native code.
    # See problematic frame for where to report the bug.
    #
    Alors voilà, je dois respecter le header, donc est-ce que quelqu'un à une idée?

    Sinon aussi c'est dommage que quand je passe en paramètre ma structure par pointeur et que je modifie cette structure dans une fonction C, je ne retrouve pas les modifications après en Java. C'est sans doute normal, faut peut-être pas que j'en demande de trop ^^. ou non?

    Merci d'avance à tous.

    Et j'espère que je me suis bien fait comprendre, sinon veuillez m'en excuser

  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
    Voilà j'ai résolu l’affaire comme un grand .

    En somme et c'est assez logique, c'est Structure.ByReference qu'il faut utiliser et pas Structure.ByValue.

    Ca me permet de résoudre mon problème et aussi ma sous question, je vais dire.

    Merci.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/04/2013, 11h11
  2. Réponses: 5
    Dernier message: 15/04/2012, 16h40
  3. Utiliser structure tm dans une autre structure
    Par Mélodie_et_rythmes dans le forum C
    Réponses: 9
    Dernier message: 01/04/2012, 13h03
  4. Copier une structure dans une autre
    Par rvzip64 dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2008, 17h48
  5. Structures complexes dans une autre structure?
    Par cata2 dans le forum MATLAB
    Réponses: 4
    Dernier message: 19/09/2007, 23h05

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