1. 程式人生 > >java使用JNA呼叫系統Kernel32.dll檔案示例

java使用JNA呼叫系統Kernel32.dll檔案示例

有時候需要呼叫系統的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

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下載,不過文章中都有,複製複製就可以了。