0

I want to use SYSTEMTIME struct as field of WFSRESULT struct. But when I try to init new object of WFSRESULT based on Pointer, then I got exception. There are my structures:

public class WFSRESULT extends Structure {

    public WFSRESULT() {

    }

    public WFSRESULT(Pointer p) {
        super(p);
        read();
    }

    public int RequestID;
    public short hService;
    public SYSTEMTIME tsTimestamp;
    public int hResult;
    public int dwCommandCode;
    public int dwEventID;
    public Pointer lpBuffer;

    @Override
    protected List getFieldOrder() {
        return Arrays.asList(new String[]{"RequestID", "hService", "tsTimestamp", "hResult", "dwCommandCode", "dwEventID", "lpBuffer"});
    }
}

    public class SYSTEMTIME extends Structure {

    public SYSTEMTIME() {
    }

    public short wYear;
    public short wMonth;
    public short wDayOfWeek;
    public short wDay;
    public short wHour;
    public short wMinute;
    public short wSecond;
    public short wMilliseconds;

    @Override
    protected List getFieldOrder() {
        return Arrays.asList(new String[]{"wYear", "wMonth", "wDayOfWeek", "wDay", "wHour", "wMinute", "wSecond", "wMilliseconds"});
    }
}

Initialization:

wfsResult = new WFS().new WFSRESULT(ipResult);

Exception (in super(p) line):

Exception in thread "main" java.lang.IllegalArgumentException: Invalid Structure field in class g60.wfs.WFS$WFSRESULT, field name 'tsTimestamp' (class g60.wfs.WFS$SYSTEMTIME): Can't instantiate class g60.wfs.WFS$SYSTEMTIME
    at com.sun.jna.Structure.validateField(Structure.java:1109)
    at com.sun.jna.Structure.validateFields(Structure.java:1119)
    at com.sun.jna.Structure.<init>(Structure.java:179)
    at com.sun.jna.Structure.<init>(Structure.java:172)
    at com.sun.jna.Structure.<init>(Structure.java:168)
    at g60.wfs.WFS$WFSRESULT.<init>(WFS.java:44)
    at g60.g60Handling.logMessage(g60Handling.java:132)
    at g60.g60Handling.runInitializationRoutine(g60Handling.java:117)
    at g60.g60Handling.<init>(g60Handling.java:56)
    at g60.g60Handling.main(g60Handling.java:40)
Caused by: java.lang.IllegalArgumentException: Can't instantiate class g60.wfs.WFS$SYSTEMTIME
    at com.sun.jna.Structure.newInstance(Structure.java:1781)
    at com.sun.jna.Structure.newInstance(Structure.java:1759)
    at com.sun.jna.Structure.size(Structure.java:1030)
    at com.sun.jna.Native.getNativeSize(Native.java:1172)
    at com.sun.jna.Structure.getNativeSize(Structure.java:2072)
    at com.sun.jna.Structure.getNativeSize(Structure.java:2062)
    at com.sun.jna.Structure.validateField(Structure.java:1105)
    ... 9 more
Caused by: java.lang.InstantiationException: g60.wfs.WFS$SYSTEMTIME
    at java.lang.Class.newInstance(Class.java:427)
    at com.sun.jna.Structure.newInstance(Structure.java:1773)
    ... 15 more
Caused by: java.lang.NoSuchMethodException: g60.wfs.WFS$SYSTEMTIME.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 16 more
Barq Last
  • 1
  • 1

1 Answers1

0

You need to make SYSTEMTIME static, or define it outside of WFSRESULT. Otherwise it always has an implicit reference to the surrounding WFSRESULT class, which JNA cannot generate automatically.

technomage
  • 9,861
  • 2
  • 26
  • 40