【解决 HCNetSDK.dll 无法加载问题】海康 SDK 开发对接 java 项目 demo 运行

前言

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

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

正文

官方文档直通车https://www.hikvision.com/cn/download_61.html
在这里插入图片描述
官方文档给出的【注意事项

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

1
2
3
4
5
6
7
8
9
10
11
12
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': ÕҲ»µ½ָ¶¨

1
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': ÕҲ»µ½ָ¶¨

1
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() 方法来解决找不到路径的问题。

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//获取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工具类,下面的代码给出解决方案


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


五、引入工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//原始写法
// 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类中有提示

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

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

在这里插入图片描述


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

在这里插入图片描述