【解决 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 | HCNetSDK.dll、 |
等文件均要加载到程序里面,【HCNetSDKCom 文件夹】(包含里面的功能组件 dll 库文件)需要和 HCNetSDK.dll、HCCore.dll 一起加载,放在同一个目录下,且 HCNetSDKCom 文件夹名不能修改。
二、 如果自行开发软件不能正常实现相应功能,而且程序没有指定加载的 dll 库路径,请在程序运行的情况下尝试删 HCNetSDK.dll。如果可以删除,说明程序可能调用到系统盘 Windows->System32 目录下的 dll 文件,建议删除或者更新该目录下的相关 dll 文件;如果不能删除,dll 文件右键选择属性确认 SDK 库版本。
三、如按上述步骤操作后还是不能实现相应功能,请根据 NET_DVR_GetLastError 返回的错误号判断原因。
—————————————————————————————————————————————–
基于海康SDK 开发提供的 demo 之 java 版运行,基于 HCNetSDKV6.1.4.42 版本写的,此时是官方提供的最新版本。
一、环境的确认
注意:我下载的是 64 位的 SDK,操作系统 win10_x64,jdk_x64,熟读官方文档真的很重要,会少走很多弯路。JDK 和 SDK 版本必须一致,同是 32 位或者 64 位。如果不统一,遇到问题我也没辙。
二、引入项目到编辑器
使用 eclipse for javaee 或者 IDEA 都行,看个人喜好嘛。注意必须要将 jar 包和库文件 build path 怎么引入我相信大家肯定知道,example.jar 和 jna.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 | //获取DLL文件路径 |
上面的工具类写好后,就可以修改HCNetSDK.java 类,我给出原始文档写法和改良后的写法。修改 HCNetSDK 对象,引入 GetDLLPath工具类,下面的代码给出解决方案:
建议多手动敲代码,不要一味的复制粘贴。不然你会生疏的,除非是达到了一定的技术后,可以偷偷懒也是可以的嘛,当然这是玩笑话,活跃下气氛。
五、引入工具类
1 | //原始写法 |
六、运行成功后的界面
做完以上步骤后,终于可以运行起来了。demo 起飞,开启征程。工欲善其事,必先利其器。
当然这是官方文档基于java 的 swing 写出的 demo。如果项目需要引入,基本是用 web 开发的模式,网上找一找海康 web3.0 也是可行的。当然你自己写个出来,也是可行的,最终你还是要在自己的项目中编写接口拿到数据。
七、分析接口
其实不难发现,最重要的就是 HCNetSDK 这个接口里面提供的类容。比如定义了一些常量和全局错误代码可供快速查询,具体还是看你需要用到那一部分。下面截取部分代码:

最后点击注册时遇到了报错提示,可以使用 hCNetSDK.NET_DVR_GetLastError() 方法,获取错误 code 码,在 HCNetSDK类中有提示。
1 | System.out.println(hCNetSDK.NET_DVR_GetLastError()); |
注册失败,通过错误 code 码定位原因。

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