Hi,
I have a problem passing a structure which contains a string. Here is
what I am doing. Is that the right way to go? I get the expected
result, but it triggers an exception, so I suppose something in my
usage of JNA is wrong. But what ?
Thank you
Sebastien
* C type definition
typedef struct VI_TagEntry_t{
TCHAR* name;
} VI_TagEntry;
* Java JNA type definition
public static class VI_TagEntry extends Structure {
public WString name;
}
* Java test code (in test class called JNATest)
public void testVI_TagEntry() {
Dll.VI_TagEntry tagEntry = new Dll.VI_TagEntry();
tagEntry.name = new WString("sample text");
tagEntry.write();
lib.testVI_TagEntry(tagEntry); /* throws exception, see below */
}
* called C code
_declspec(dllexport) void __cdecl testVI_TagEntry(VI_TagEntry* tagEntry) {
printf("tagEntry.name=%S \n", tagEntry->name);
}
* output
tagEntry.name=sample text
* Exception at the line marked above
java.lang.RuntimeException: Exception setting field "name"
at com.sun.jna.Structure.readField(Structure.java:329)
at com.sun.jna.Structure.read(Structure.java:203)
at com.sun.jna.Function.invoke(Function.java:191)
at com.sun.jna.Library$Handler.invoke(Library.java:144)
at $Proxy0.testVI_TagEntry(Unknown Source)
at JNATest.testVI_TagEntry(JNATest.java:82)
(etc)
Caused by: java.lang.IllegalArgumentException
at
sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
at java.lang.reflect.Field.set(Field.java:656)
at com.sun.jna.Structure.readField(Structure.java:326)
... 24 more