看了不少关于jna 调用Kernel32 GetLocalTime 的文章 ,现在的新的jna5.6 结构需要加
@FieldOrder,否则会出现 Exception in thread "main" java.lang.Error: Structure.getFieldOrder() on class test$PSYSTEMTIME does not provide enough names [0] ([]) to match declared fields [8] ([wDay, wDayOfWeek, wHour, wMilliseconds, wMinute, wMonth, wSecond, wYear]) at com.sun.jna.Structure.getFields(Structure.java:1077) at com.sun.jna.Structure.deriveLayout(Structure.java:1232) at com.sun.jna.Structure.calculateSize(Structure.java:1159) at com.sun.jna.Structure.allocateMemory(Structure.java:401) at com.sun.jna.Structure.ensureAllocated(Structure.java:377) at com.sun.jna.Structure.ensureAllocated(Structure.java:367) at com.sun.jna.Structure.write(Structure.java:764) at com.sun.jna.Structure.autoWrite(Structure.java:2228) at com.sun.jna.Function.convertArgument(Function.java:532) at com.sun.jna.Function.invoke(Function.java:345) at com.sun.jna.Library$Handler.invoke(Library.java:265) at com.sun.proxy.$Proxy0.GetLocalTime(Unknown Source) at test.main(test.java:61)
代码如下:
package com.jan_test; import com.sun.jna.*; import com.sun.jna.win32.*; import com.sun.jna.Structure.FieldOrder; import static com.sun.jna.platform.win32.Wtsapi32.INSTANCE; public class Main { @FieldOrder({ "wYear", "wMonth", "wDayOfWeek", "wDay", "wHour", "wMinute", "wSecond", "wMilliseconds" }) public static class SYSTEMTIME extends Structure { public short wYear; public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; } public interface Kernel32 extends StdCallLibrary { void GetLocalTime (SYSTEMTIME result); } public static void main(String[] args) { // write your code here Kernel32 lib = Native.load ("kernel32",Kernel32.class); //Kernel32 SYNC_INSTANCE = (Kernel32) Native.synchronizedLibrary(INSTANCE); SYSTEMTIME time = new SYSTEMTIME (); lib.GetLocalTime (time); System.out.println ("Year is "+time.wYear); System.out.println ("Month is "+time.wMonth); System.out.println ("Day of Week is "+time.wDayOfWeek); System.out.println ("Day is "+time.wDay); System.out.println ("Hour is "+time.wHour); System.out.println ("Minute is "+time.wMinute); System.out.println ("Second is "+time.wSecond); System.out.println ("Milliseconds are "+time.wMilliseconds); } }