这篇是入门教程
准备工作:
1. 从官网下载demo,其中包含了java的demo
2. 将HCNetSDK.java 直接复制到自己的项目中
3. 将java的demo中的examples.jar和jna.jar加载到自己的项目中
开始编程:
l java的数据类型和C++的对应关系(大部分可用,小部分需要根据实际情况调整)
C++ |
Java |
char * |
String |
word |
short |
byte |
byte |
byte[] |
byte[] |
dword |
int |
long |
NativeLong |
Void * |
Pointer |
lpvoid |
Pointer |
lpDword |
IntByReference |
HWND |
HWND |
char[] |
byte[] |
byte * |
Pointer |
l 根据sdk手册的信息建立相应的类,接口,回调函数,新建立的这些最好也放到HCNetSDK.java中。
l 在自己的类中需要实例化HCNetSDK,具体写法是:staticHCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
l 然后再初始化:booleaninitSuc = hCNetSDK.NET_DVR_Init(); 返回true表示成功。
举例:NET_DVR_USER_LOGIN_INFO
c++中的写法是:
struct{
char sDeviceAddress[NET_DVR_DEV_ADDRESS_MAX_LEN];
BYTE byRes1;
WORD wPort;
char sUserName[NET_DVR_LOGIN_USERNAME_MAX_LEN];
char sPassword[NET_DVR_LOGIN_PASSWD_MAX_LEN];
fLoginResultCallBack cbLoginResult;
void *pUser;
BOOL bUseAsynLogin;
BYTE byRes2[128];
}NET_DVR_USER_LOGIN_INFO,*LPNET_DVR_USER_LOGIN_INFO;
改成相应的java的写法是:需要注意的是必须继承Structure类,数组类必须初始化并定义长度,长度严格按照sdk手册上的定义。
public staticclass NET_DVR_USER_LOGIN_INFO extends Structure {
public byte[] sDeviceAddress = newbyte[NET_DVR_DEV_ADDRESS_MAX_LEN];
public bytebyRes1;
public shortwPort;
public byte[] sUserName = newbyte[NET_DVR_LOGIN_USERNAME_MAX_LEN];
public byte[] sPassword = newbyte[NET_DVR_LOGIN_PASSWD_MAX_LEN];
public FLoginResultCallBack cbLoginResult;
public Pointer pUser;
public booleanbUseAsynLogin;
public byte[] byRes2 = newbyte[128];
}
在这个类中,有回调函数FLoginResultCallBack,该函数在c++中的定义为:
Callback Function
typedef void(CALLBACK *fLoginResultCallBack)(
LONG lUserID,
DWORD dwResult,
LPNET_DVR_DEVICEINFO_V30 lpDeviceInfo,
void *pUser
);
改成java后如下:这个接口定义在HCNetSDK.java中
public static interface FLoginResultCallBack extends StdCallCallback {
public void invoke(NativeLong lUserID, intdwResult, Pointer pUser);
}
然后在自己的类中写关于回调函数的如下代码:
class FLoginResultCallBackimplementsHCNetSDK.FLoginResultCallBack {
publicvoid invoke(NativeLong lUserID, intdwResult, Pointer pUser) {
//这里按自己的需要写
}
}
下面为NET_DVR_USER_LOGIN_INFO类填充信息
sDeviceAddress:这个是人脸机的ip地址,可以这么赋值:
String sDeviceIP = "192.168.0.13";
for (inti = 0; i < sDeviceIP.length(); i++) {
pLoginInfo.sDeviceAddress[i] = (byte) sDeviceIP.charAt(i);
}
需要注意的是pLoginInfo.sDeviceAddress[]在类NET_DVR_USER_LOGIN_INFO定义的时候已经初始化并定义了长度了,这个长度必须按照sdk手册上的来,不能自己定义长度。
同理可给用户名和密码赋值。
端口号设置:pLoginInfo.wPort = (short) 8000;
回调函数赋值:前面已经定义了回调函数了,这里进行赋值
FLoginResultCallBack fLoginResultCallBack= newFLoginResultCallBack();
pLoginInfo.cbLoginResult = fLoginResultCallBack;
至此,登录的类已经完成。
我使用的是NET_DVR_Login_V40这个方法进行登录,因此还需要NET_DVR_DEVICEINFO_V40类,和NET_DVR_USER_LOGIN_INFO类的定义方法类似。
在HCNetSDK.java中对方法NET_DVR_Login_V40进行定义
NativeLong NET_DVR_Login_V40(NET_DVR_USER_LOGIN_INFO pLoginInfo,NET_DVR_DEVICEINFO_V40 lpDeviceInfo);
在NET_DVR_Login_V40方法中,对于lpDeviceInfo,只要new一个就可以了,不用对里面的属性进行赋值。
然后进行登录:
NativeLong lUserID = hCNetSDK.NET_DVR_Login_V40(pLoginInfo, lpDeviceInfo);
lUserID的返回值大于-1就是成功了。
最后整理下整个流程
定义两个类:
HCNetSDK.NET_DVR_USER_LOGIN_INFO pLoginInfo = newHCNetSDK.NET_DVR_USER_LOGIN_INFO();
HCNetSDK.NET_DVR_DEVICEINFO_V40 lpDeviceInfo = newHCNetSDK.NET_DVR_DEVICEINFO_V40();
对pLoginInfo的属性进行赋值:之前漏了一个pLoginInfo.bUseAsynLogin = false;
调用登录方法NativeLonglUserID = hCNetSDK.NET_DVR_Login_V40(pLoginInfo, lpDeviceInfo);
返回大于-1的整数表示成功,如果返回-1,则可以调用
int error = hCNetSDK.NET_DVR_GetLastError(); 根据返回的错误代码,在sdk手册中找出相应的原因。
HCNetSDK.java这个类中已经定义了很多方法,接口,类了,因此在定义的时候先查找一下是否已经存在了。
就登录而言,很多设备的方法大同小异,不止局限于人脸机5603
sdk中的很多类中有类,一层套一层,定义的时候需要把它们都定义了。