有時候需要調用系統的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項目地址:https://jna.dev.java.net/
JNA的安裝很簡單,把從官網下載的jna.jar包導入工作路徑就可以了。
下面測試系統API的幾個方法,如GetLocalTime(),GetSystemTime(),SetLocalTime()等方法。
GetLocalTime():獲取本地時間。
GetSystemTime():獲取格林威治時間。
SetLocalTime():設置本地時間。注:此方法需要系統管理員權限。
通過查詢知道這些方法都封裝在kernel32.dll文件中,下面進行調用。
1.編寫接口類Kernel32.java
package 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;
2.編寫調用類LocalTime.java
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下載,不過文章中都有,複製複製就可以了。