幾種java呼叫dll的方式
阿新 • • 發佈:2019-01-02
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的一大弱點!只提供幾個連結吧!
以上原始碼下載