Java和海康SDK是企業級開發中非常常用的技術,但是在應用海康SDK時經常需要使用到一些Windows dll庫,如何在Java中使用這些dll庫呢?本文將介紹使用Java Native Interface(JNI)和JNA的方式,讓Java能夠調用Windows dll庫。
使用JNI調用Windows dll庫
JNI提供了Java和本地(native)代碼之間的接口,我們可以使用JNI將Java應用程序與Windows動態鏈接庫(dll)建立聯系。下面介紹一下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(); }
先看靜態塊中的System.loadLibrary("HCNetSDK");
,使用System類提供的方法,實現將動態鏈接庫加載到JVM中的過程。
使用native
關鍵字,聲明需要調用的Windows動態鏈接庫的方法。以上面代碼為例,在Java中聲明了三個方法,均在Windows的動態鏈接庫中有對應的函數。
使用JNA調用Windows dll庫
JNA是一種Java Native Access,是一個簡單化操作系統原生動態鏈接庫和共享庫的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調用dll庫,只需要定義一個接口來描述該庫即可。上述代碼以海康SDK為例,定義了一些庫中的函數,使用Native.loadLibrary(String, Class)
方法,加載庫文件,直接調用定義好的接口即可。
以上兩種方式都能很好地在Java中調用Windows動態鏈接庫,開發者可按需選擇。不同的是,JNI的方式更加靈活,但需要手動編寫一系列的實現函數;而JNA對編寫實現函數有較高的要求,但調用時更加方便快捷。