Java开发海康SDK通过JNA调用动态链接库报错的问题总结如下

由于公司项目需要用海康的sdk开发库。把在初始化链接海康sdk库文件的报错问题总结如下

1操作系统,JDK,SDK库版本最好一致。不然很悲剧,请参考博文

主机

dll

jdk

可行

32

32

32

1

32

64

32

0

64

32

32

1

64

64

32

0

64

32

64

0

64

64

64

1


关于JNA调用32位和64位动态链接库,即*.dll

https://blog.csdn.net/u014095729/article/details/50546319

结论:dll可否调用与jdk位数有关,需要一致才行。

2海康64位库文件后缀.dll必须加上不然报错:

64位系统加64jdk.dll库后缀,注意:jna64位必须加库文件后缀.

3库路径最好用绝对路径。路径格式必须为算斜杠

库路径D:/eclipse-x86-64-1704/workspace/Hktest/lib/HCNetSDK.dll这样的形式也报错

加载的库路径必须这种写法不然也报错D:\\eclipse-x86-64-1704\\workspace\\Hktest\\lib\\HCNetSDK.dll

海康加载库文件报错如下形式

java.lang.UnsatisfiedLinkError: Unable to load library

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用海康SDK进行警订阅的Java代码示例,仅供参考: ```java import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.ByteByReference; import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.PointerByReference; import com.sun.jna.win32.StdCallLibrary; public interface HCNetSDK extends StdCallLibrary { // SDK初始化和反初始化 public static native boolean NET_DVR_Init(); public static native boolean NET_DVR_Cleanup(); // 用户注册和注销 public static native NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo); public static native boolean NET_DVR_Logout(NativeLong lUserID); // 警布防和撤防 public static native NativeLong NET_DVR_SetupAlarmChan_V30(NativeLong lUserID, NET_DVR_ALARMER pAlarmer, Pointer fAlarmDataCallBack, Pointer pUser); public static native boolean NET_DVR_CloseAlarmChan_V30(NativeLong lAlarmHandle); } // 警回调函数 public class AlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { public void invoke(NativeLong lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, HCNetSDK.RECV_ALARM pAlarmInfo, int dwBufLen, Pointer pUser) { switch (lCommand.intValue()) { case HCNetSDK.COMM_ALARM_V30: // 警信息 System.out.println("Receive alarm message, type: COMM_ALARM_V30"); break; case HCNetSDK.COMM_ALARM_RULE: // 行为分析警信息 System.out.println("Receive alarm message, type: COMM_ALARM_RULE"); break; case HCNetSDK.COMM_UPLOAD_PLATE_RESULT: // 车牌识别结果上传 System.out.println("Receive alarm message, type: COMM_UPLOAD_PLATE_RESULT"); break; default: System.out.println("Receive alarm message, type: other"); break; } } } public class Main { public static void main(String[] args) { // 初始化SDK boolean initResult = HCNetSDK.NET_DVR_Init(); if (!initResult) { System.out.println("Failed to initialize SDK"); return; } // 注册设备 String deviceIP = "192.168.1.100"; // 设备IP地址 short devicePort = 8000; // 设备端口号 String username = "admin"; // 设备用户名 String password = "12345"; // 设备密码 HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); NativeLong userId = HCNetSDK.NET_DVR_Login_V30(deviceIP, devicePort, username, password, deviceInfo); if (userId.intValue() < 0) { System.out.println("Failed to login device, error code: " + HCNetSDK.NET_DVR_GetLastError()); HCNetSDK.NET_DVR_Cleanup(); // 反初始化SDK return; } // 设置警回调函数 HCNetSDK.FMSGCallBack_V31 alarmCallback = new AlarmCallBack(); Pointer alarmCallbackPointer = alarmCallback.getPointer(); NativeLong alarmHandle = HCNetSDK.NET_DVR_SetupAlarmChan_V30(userId, null, alarmCallbackPointer, null); if (alarmHandle.intValue() < 0) { System.out.println("Failed to setup alarm channel, error code: " + HCNetSDK.NET_DVR_GetLastError()); HCNetSDK.NET_DVR_Logout(userId); // 注销设备 HCNetSDK.NET_DVR_Cleanup(); // 反初始化SDK return; } // 等待警信息 System.out.println("Waiting for alarm message..."); Scanner scanner = new Scanner(System.in); scanner.nextLine(); // 关闭警通道 boolean closeResult = HCNetSDK.NET_DVR_CloseAlarmChan_V30(alarmHandle); if (!closeResult) { System.out.println("Failed to close alarm channel, error code: " + HCNetSDK.NET_DVR_GetLastError()); } // 注销设备 boolean logoutResult = HCNetSDK.NET_DVR_Logout(userId); if (!logoutResult) { System.out.println("Failed to logout device, error code: " + HCNetSDK.NET_DVR_GetLastError()); } // 反初始化SDK boolean cleanupResult = HCNetSDK.NET_DVR_Cleanup(); if (!cleanupResult) { System.out.println("Failed to cleanup SDK"); } } } ``` 在代码中,我们首先使用`NET_DVR_Init`函数初始化海康SDK,然后使用`NET_DVR_Login_V30`函数注册设备,并获取设备的用户ID。着,我们使用`NET_DVR_SetupAlarmChan_V30`函数设置警回调函数,并等待警信息。当收到警信息时,警回调函数会被调用,并进行相应的处理。最后,我们使用`NET_DVR_CloseAlarmChan_V30`函数关闭警通道,并使用`NET_DVR_Logout`函数注销设备,最后使用`NET_DVR_Cleanup`函数反初始化SDK

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值