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
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
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
Mtn code 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 #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; }*/
Class contenant mon interface
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
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{} } }
Donc voilà mon problème :
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"); } }
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 :
Alors voilà, je dois respecter le header, donc est-ce que quelqu'un à une idée?
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. #
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![]()
Partager