1. 程式人生 > >幾種java呼叫dll的方式

幾種java呼叫dll的方式

Java呼叫DLL有多種方式,常用的方式有JNative、JNA、JNI等。

JNative方式呼叫dll

JNative是一種能夠使Java語言使呼叫DLL的一種技術,對JNI進行了封裝,可能有些讀者會有這樣一個問題,JNative對JNI進行了封裝,並且是一種跨語言的使用DLL,會不會在效率方面很不如人意,我可以用我使用Jnative的經驗告訴你,不會!因為我用Jnative就是用來處理大量的資料呼叫,是基於實時資料庫介面的呼叫。而實時資料庫的資料量是非常大的。 注意:將JNative解壓,並將其中的JNativeCpp.dll拷貝到system32資料夾中,libJNativeCpp.so是linux平臺使用的。
程式碼:
package com.tvjody;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.util.Kernel32.SystemTime;

public class Demo {
	public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
		// Kernel32.dll為dll名稱,Kernel32目錄的位置為:C:\Windows\System32下面,
		// GetSystemTime為Kernel32.dll中的一個方法.
		JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime");
		SystemTime systemTime = new SystemTime();
		// 設定引數
		nGetSystemTime.setParameter(0, systemTime.getPointer());
		nGetSystemTime.invoke();
		// 解析結構指標內容
		return systemTime.getValueFromPointer();
	}

	public static void main(String[] args) throws NativeException, IllegalAccessException {
		System.err.println(GetSystemTime());
		System.exit(0);
	}
}

JNA方式呼叫dll

JNA(Java Native Access)框架是一個開源的Java框架,是SUN公司主導開發的,建立在經典的JNI的基礎之上的一個框架。  首先下載JNA 程式碼:
package com.tvjody;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class JNA {

	// 定義介面CLibrary,繼承自com.sun.jna.Library
	public interface testdll extends Library {
		// msvcrt為dll名稱,msvcrt目錄的位置為:C:\Windows\System32下面,
		testdll Instance = (testdll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
				testdll.class);
		// printf為msvcrt.dll中的一個方法.
		void printf(String format, Object... args);
	}

	public static void main(String[] args) {
		// 呼叫printf列印資訊
		testdll.Instance.printf("yyyyMMdd");
	}

}

JNI呼叫dll

如果有一個現有的.dll/.so檔案,如果使用JNI技術呼叫,我們首先需要另外使用C語言寫一個.dll/.so共享庫,使用SUN規定的資料結構替代C語言的資料結構,呼叫已有的dll/so中公佈的函式。
然後再在Java中載入這個介面卡dll/so,再編寫Java   native函式作為dll中函式的代理。經過2個繁瑣的步驟才能在Java中呼叫原生代碼。
因此,很少有Java程式設計師願意編寫呼叫dll/.so庫中的原生函式的java程式。這也使Java語言在客戶端上乏善可陳。可以說JNI是Java的一大弱點!只提供幾個連結吧!

以上原始碼下載