博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【解决HCNetSDK.dll无法加载问题】海康SDK开发对接java项目demo运行
阅读量:4228 次
发布时间:2019-05-26

本文共 4325 字,大约阅读时间需要 14 分钟。

前言

最近公司有新需求,需要接入大华海康的项目,优先解决接入海康的SDK。对于我这个之前完全没接触过对接SDK的新手来说,完全是焦头烂额。公司只提供了SDK文档,没有其它文档支持。但是需要使用java进行对接数据。俗话说的好,工欲善其事,必先利其器。海康官方的SDK文档提供了javademo例子,但是文档说明并不全面(个人感觉,遇到了很多坑,故予以总结)。

运行demo之前,最好浏览一遍SDK文档,比如操作系统与JDK以及DLL文件保持一致性。而且对你调试代码也颇有帮助,返回一些错误码在官方提供的文档有说明参照。例如:win64下运行64位JDK和64位DLL文件,也可以运行32位JDK和32位的DLL文件。

目录

正文

官方文档直通车

在这里插入图片描述

官方文档给出的【注意事项

----------------------------------------------------------------------------------------------------------------------------------------

一、 更新设备网络SDK时,SDK开发包【库文件】里的

HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、HCNetSDKCom文件夹、ssleay32.dll、libeay32.dll、hlog.dll、hpr.dll、zlib1.dll、log4cxx.properties

等文件均要加载到程序里面,【HCNetSDKCom文件夹】(包含里面的功能组件dll库文件)需要和HCNetSDK.dllHCCore.dll一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改

二、 如果自行开发软件不能正常实现相应功能,而且程序没有指定加载的dll库路径,请在程序运行的情况下尝试删HCNetSDK.dll。如果可以删除,说明程序可能调用到系统盘Windows->System32目录下的dll文件,建议删除或者更新该目录下的相关dll文件;如果不能删除,dll文件右键选择属性确认SDK库版本。

三、如按上述步骤操作后还是不能实现相应功能,请根据NET_DVR_GetLastError返回的错误号判断原因

-----------------------------------------------------------------------------------------------------------------------------------------

基于海康SDK开发提供的demojava版运行,基于HCNetSDKV6.1.4.42版本写的,此时是官方提供的最新版本

在这里插入图片描述

环境的确认

注意我下载的是64位的SDK,操作系统win10_x64,jdk_x64熟读官方文档真的很重要,会少走很多弯路JDK和SDK版本必须一致,同是32位或者64位。如果不统一,遇到问题我也没辙。

在这里插入图片描述

引入项目到编辑器

使用eclipse for javaee或者IDEA都行,看个人喜好嘛。注意必须要将jar包和库文件build path怎么引入我相信大家肯定知道,example.jarjna.jar引入后代码就不会报红了。引入这里面指定的也能运行起来demo,没必要将整个库文件引入。

eclipse引入项目的目录结构,我直接新建了sdk文件夹放入指定的库文件

在这里插入图片描述

IDEA引入项目的目录结构,这是将整个库文件完全引入时做的测试

在这里插入图片描述

遇到问题并解析问题

最开始你会看到这个不友好的警告,一个很严重的java异常

在这里插入图片描述

运行java版demo遇到的问题一Unable to load library 'HCNetSDK': ÕҲ»µ½ָ¶¨

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'HCNetSDK': ÕҲ»µ½ָ¶¨

在这里插入图片描述

解析问题一:不难看出来,无法去加载库文件HCNetSDK.dll这时你分析一下这个报错的代码提示,可以看出来定位到ClientDemo.java这个类的第66行,那肯定是找不到HCNetSDK接口里提供的HCNetSDK实例。再向上看定位分析,找不到HCNetSDK.dll路径,定位到第36行。遇到报错不要怕,重要的是学会分析问题所在并去解决掉,领导也喜欢善于解决问题的。

运行java版demo遇到的问题二Unable to load library 'PlayCtrl': ÕҲ»µ½ָ¶¨

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'PlayCtrl': ÕҲ»µ½ָ¶¨

在这里插入图片描述

解析问题二:不难看出来,无法去加载库文件PlayCtrl.dll这时你分析一下这个报错的代码提示,可以看出来定位到ClientDemo.java这个类的第67行,那肯定是找不到PlayCtrl接口里提供的PlayCtrl实例。再向上看定位分析,找不到PlayCtrl.dll路径,定位到第3069行。遇到报错不要怕,重要的是学会分析问题所在并去解决掉,领导也喜欢善于解决问题的。

工具类编写

解析完问题后,我们了解到无法加载HCNetSDK.dll、PlayCtrl.dll这个两个库文件,下面给出解决方案:我采用的是编写工具类GetDLLPath()方法来解决找不到路径的问题。

代码如下

//获取DLL文件路径public class GetDLLPath {
//路径 public static String DLL_PATH; static{
//通过getPath方法去拿路径 String path = GetDLLPath.class.getResource("/").getPath() .replaceAll("20%", " ").substring(1); // 这个是解决打包找不到路径的写法,但是目前引入demo运行用不上,我就注释掉了// String[] ph = path.split("/"); // StringBuilder sb = new StringBuilder();// for(int i= 0;i < ph.length-2;i++){
// sb.append("/").append(ph[i]);// } // //解决打包加载类找不到路径的问题,这里编写你自己存放的路径// sb.append("/src/main/resource/sdk");// path = sb.toString(); try {
//设置编码为UTF-8,这样设置转码会出一个问题,一旦遇到+号这种就会转成空格 DLL_PATH = java.net.URLDecoder.decode(path,"utf-8"); } catch (Exception e) {
e.printStackTrace(); } } public static void main(String[] args) {
//测试 }}

上面的工具类写好后,就可以修改HCNetSDK.java类,我给出原始文档写法和改良后的写法。修改HCNetSDK对象,引入GetDLLPath工具类,下面的代码给出解决方案

建议多手动敲代码,不要一味的复制粘贴。不然你会生疏的,除非是达到了一定的技术后,可以偷偷懒也是可以的嘛,当然这是玩笑话,活跃下气氛。

引入工具类

//原始写法//    HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK",//            HCNetSDK.class);		//改完后的写法:通过GetDLLPath工具类去找dll绝对路径    HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(GetDLLPath.DLL_PATH     + "HCNetSDK.dll",HCNetSDK.class);			//原始写法//	 PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary("PlayCtrl",//	            PlayCtrl.class);	//改良后写法:通过GetDLLPath工具类去找dll绝对路径    PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(GetDLLPath.DLL_PATH     					+"PlayCtrl.dll",PlayCtrl.class);

运行成功后的界面

做完以上步骤后,终于可以运行起来了demo起飞,开启征程。工欲善其事,必先利其器

在这里插入图片描述
当然这是官方文档基于javaswing写出的demo。如果项目需要引入,基本是用web开发的模式,网上找一找海康web3.0也是可行的。当然你自己写个出来,也是可行的,最终你还是要在自己的项目中编写接口拿到数据。

分析接口

其实不难发现,最重要的就是HCNetSDK这个接口里面提供的类容。比如定义了一些常量和全局错误代码可供快速查询,具体还是看你需要用到那一部分。下面截取部分代码

在这里插入图片描述
在这里插入图片描述

最后点击注册时遇到了报错提示,可以使用hCNetSDK.NET_DVR_GetLastError()方法,获取错误code码,在HCNetSDK类中有提示

System.out.println(hCNetSDK.NET_DVR_GetLastError());

注册失败,通过错误code码定位原因。

在这里插入图片描述

定位错误可以参考官方给出的PDF帮助文档

在这里插入图片描述

说不定后续还会继续更新如何去拿数据的文章,未完待续

尾声

好了,到此为止就是此篇文章的全部内容了,能看到这里的都是帅哥靓妹啊!!!善于总结,其乐不穷。好记性不如烂笔头,多收集自己第一次尝试的成果,收获也颇丰。你会发现,自己的知识宝库越来越丰富。点关注,不迷路。

转载地址:http://hzcqi.baihongyu.com/

你可能感兴趣的文章
思科ASR防火墙实操手册
查看>>
ChromeDriver与Chrome版本对应参照表及ChromeDriver下载链接
查看>>
管家婆SQL SERVER数据库修复案例
查看>>
实战 SQL Server 2008 数据库误删除数据的恢复
查看>>
SQL数据库823错误
查看>>
无日志恢复SQL Server数据库
查看>>
教您修复mysql数据库的方法
查看>>
分享给大家一个查找mdf文件,恢复数据的免费软件
查看>>
SQL Server置疑数据库解决方法
查看>>
SQL数据库损坏,报错,原因及注意事项
查看>>
数据库丢失后的紧急注意事项
查看>>
SQL数据库损坏怎么办?教你数据恢复应急方案
查看>>
数据安全恢复保障,企业阵列问题
查看>>
mdf误删除碎片提取工具功能介绍
查看>>
SQLSERVER数据库找回数据
查看>>
SQL数据修复,SQL数据库修复,SQL数据库修复软件,SQL数据库恢复,SQL数据库日志恢复软件
查看>>
用友U8数据库修复用友t3数据库修复用友/823错误824错误/检测到基于一致性的逻辑 I O 错误/ tempdb 空间用尽或某一系统表不一致
查看>>
SQL2005断电重启数据库置疑修复成功案例
查看>>
Sql Server 2008 R2数据库损坏修复成功案例
查看>>
思迅软件思迅餐饮软件6找回会员卡信息数据库修复误删除修复
查看>>