Java和海康SDK是企業(yè)級開發(fā)中非常常用的技術(shù),但是在應(yīng)用海康SDK時經(jīng)常需要使用到一些Windows dll庫,如何在Java中使用這些dll庫呢?本文將介紹使用Java Native Interface(JNI)和JNA的方式,讓Java能夠調(diào)用Windows dll庫。
使用JNI調(diào)用Windows dll庫
JNI提供了Java和本地(native)代碼之間的接口,我們可以使用JNI將Java應(yīng)用程序與Windows動態(tài)鏈接庫(dll)建立聯(lián)系。下面介紹一下JNI如何使用。
public class HIKSDK { static { System.loadLibrary("HCNetSDK"); } public native int NET_DVR_Login_V30(String sDVRIPAddr, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo); public native boolean NET_DVR_Logout_V30(int lUserID); public native void NET_DVR_Cleanup(); }
先看靜態(tài)塊中的System.loadLibrary("HCNetSDK");
,使用System類提供的方法,實現(xiàn)將動態(tài)鏈接庫加載到JVM中的過程。
使用native
關(guān)鍵字,聲明需要調(diào)用的Windows動態(tài)鏈接庫的方法。以上面代碼為例,在Java中聲明了三個方法,均在Windows的動態(tài)鏈接庫中有對應(yīng)的函數(shù)。
使用JNA調(diào)用Windows dll庫
JNA是一種Java Native Access,是一個簡單化操作系統(tǒng)原生動態(tài)鏈接庫和共享庫的Java類庫。
public interface HCNetSDK extends Library { HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK", HCNetSDK.class); boolean NET_DVR_Init(); boolean NET_DVR_Cleanup(); int NET_DVR_GetLastError(); int NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo); boolean NET_DVR_Logout_V30(int lUserID); }
使用JNA調(diào)用dll庫,只需要定義一個接口來描述該庫即可。上述代碼以海康SDK為例,定義了一些庫中的函數(shù),使用Native.loadLibrary(String, Class)
方法,加載庫文件,直接調(diào)用定義好的接口即可。
以上兩種方式都能很好地在Java中調(diào)用Windows動態(tài)鏈接庫,開發(fā)者可按需選擇。不同的是,JNI的方式更加靈活,但需要手動編寫一系列的實現(xiàn)函數(shù);而JNA對編寫實現(xiàn)函數(shù)有較高的要求,但調(diào)用時更加方便快捷。