java使用JNA呼叫系統Kernel32.dll檔案示例
阿新 • • 發佈:2019-02-04
有時候需要呼叫系統的API,比如呼叫GetLocalTime(),GetSystemTime(),SetLocalTime()等。用過查詢知道這些方法封裝在kernel32.dll檔案中,而Java呼叫dll檔案非常麻煩,因此記錄下自己整理的一些知識,希望對大家有一點幫助。
使用java呼叫dll檔案方法很多,可以使用jni,jna,jnative等,其中jni使用步驟太麻煩,而且只能呼叫自己生成的dll檔案,有侷限性。Jnative存在32位和64位系統的問題,貌似64位系統不能使用,而且呼叫方法也很麻煩。所以,採用jna比較適合。
JNA(Java Native Access)框架是一個開源的Java框架,是SUN公司主導開發的,建立在經典的JNI的基礎之上的一個框架。
JNA的安裝很簡單,把從官網下載的jna.jar包匯入工作路徑就可以了。
下面測試系統API的幾個方法,如GetLocalTime(),GetSystemTime(),SetLocalTime()等方法。
GetLocalTime():獲取本地時間。
GetSystemTime():獲取格林威治時間。
SetLocalTime():設定本地時間。注:此方法需要系統管理員許可權。
通過查詢知道這些方法都封裝在kernel32.dll檔案中,下面進行呼叫。
1.編寫介面類Kernel32.java
2.編寫呼叫類LocalTime.javapackage SystemTime; import com.sun.jna.*; import com.sun.jna.win32.*; public interface Kernel32 extends StdCallLibrary { public static class SystemTime extends Structure { public short wYear; public short wMonth; <pre name="code" class="java">package SystemTime; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;
package SystemTime; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import SystemTime.Kernel32.SystemTime; import com.sun.jna.*; public class LocalTime { public static String getLocalTime() { String date=null; Kernel32 lib = (Kernel32) Native.loadLibrary ("kernel32",Kernel32.class); Kernel32.SystemTime time = new Kernel32.SystemTime (); lib.GetLocalTime(time); date=time.wYear+"-"+time.wMonth+"-"+time.wDay+" "+time.wHour+":"+time.wMinute+":"+time.wSecond; return date; } public static String getSystemTime() { String date=null; Kernel32 lib = (Kernel32) Native.loadLibrary ("kernel32",Kernel32.class); Kernel32.SystemTime time = new Kernel32.SystemTime (); lib.GetSystemTime(time); date=time.wYear+"-"+time.wMonth+"-"+time.wDay+" "+time.wHour+":"+time.wMinute+":"+time.wSecond; return date; } public static int setLocalTime(String time) { int flag=0; Kernel32 lib = (Kernel32) Native.loadLibrary ("kernel32",Kernel32.class); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date; try { SystemTime sysTime = new SystemTime(); date = sdf.parse(time); Calendar calendar=Calendar.getInstance(); calendar.setTime(date); sysTime.wHour = (short) calendar.get(Calendar.HOUR_OF_DAY); sysTime.wMinute = (short) calendar.get(Calendar.MINUTE); sysTime.wSecond = (short) calendar.get(Calendar.SECOND); sysTime.wMilliseconds=(short) calendar.get(Calendar.MILLISECOND); sysTime.wYear = (short) calendar.get(Calendar.YEAR); sysTime.wMonth = (short) (calendar.get(Calendar.MONTH)+1); sysTime.wDay = (short) calendar.get(Calendar.DAY_OF_MONTH); sysTime.wDayOfWeek=(short) calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); flag = lib.SetLocalTime(sysTime); } catch (ParseException e) { e.printStackTrace(); } return flag; } public static void main (String [] args) { System.out.println("LocalTime:"+getLocalTime()); System.out.println("SystemTime:"+getSystemTime()); System.out.println(setLocalTime("2014-08-21 20:05:23")); } }
有需要的可以去http://download.csdn.net/detail/aiyuan0204/7839529下載,不過文章中都有,複製複製就可以了。