海康威视(HIKVISION) JAVA SDK 打包方法

海康威视(HIKVISION) JAVA SDK 打包方法

问题

最近项目中需要调用海康的摄像头然后进行抓拍图片,由于使用的是 spring-boot 框架,然后将 DLL 动态链接库打包到 jar包,导致 JNA 获取不到 DLL 的路径。

疑问

为什么在开发的时候可以加载到DLL,打包后就会获取不到?

经过检查,发现打包后,系统会将 jar 包当成一个文件,这时候我们使用 classgetResource() 就会获取不到DLL的绝对路径。这主要是因为jar包是一个单独的文件而非文件夹,绝对不可能通过 file:/e:/.../ResourceJar.jar/resource /res.txt 这种形式的文件URL来定位文件。所以即使是相对路径,也无法定位到jar文件内的文件。我们不能用常规操作文件的方法来读取jar中的资源文件。

可能这块的东西有些童鞋不太懂,可以去搜索相关的知识或者自己读取一个资源文件,打成 jar 包试试就明白了。

解决方法一

这时候就有办法了,那么获取不到怎么办,我们是不是可以将DLL放在 jar 包外面,然后给一个绝对路径,答案是可以的。项目部署图
上图中 HCNetSDK 文件夹中放的是海康的DLL文件, hcnet-0.0.1-SNAPSHOT.jar 是项目的 jar 包。

还有一个问题,我们在部署的时候不知道运维人员到底会将项目部署到哪里,我们不能限定运维人员说必须部署到哪个盘哪个位置。这样的话,估计运维小伙伴会跟我们兵戎相见。那么我们可以在运行的时候指定 JNA 的运行路径。

@echo off
TITLE 拍照服务
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_111
path path;C:\Program Files\Java\jdk1.8.0_111\bin
java -Dfile.encoding=UTF-8 -Djna.library.path=C:\cam -jar hcnet-0.0.1-SNAPSHOT.jar
pause

脚本中第二行是设置标题,第二行和第三行是设置运行的 JDK 环境。-Djna.library.path=C:\cam 是设置 JNA 的运行路径为 C:\cam 文件夹。这样我们在开发的时候 load 方法中直接写DLL的名称即可。

获取文件路径 DllLoad

import java.io.UnsupportedEncodingException;

public class DllLoad {
    public static String DLL_PATH;
    static {
        String root = DllLoad.class.getResource("/").getPath();
        if (root.startsWith("file:/")) {  // jar包中获取到的路径
            DLL_PATH = "";
        } else {  // 实际开发中获取到的路径不带 file:/
            root = root.replaceAll("%20", " ").substring(1);
            try {
                DLL_PATH = java.net.URLDecoder.decode(root, "utf-8");
            } catch (UnsupportedEncodingException e) {
                logger.error(e.getMessage());
            }
        }
    }
}

在引用的地方使用:

HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(DllLoad.DLL_PATH + "HCNetSDK\\Win32\\HCNetSDK",
            HCNetSDK.class);

这样就解决了打 jar 后获取不到文件的尴尬情况。

解决方法二

这个方法很简单,直接打成 war 一了百了。spring-boot 如何打包成 war 网上有太多的文章,此处不在赘述。

结语

其实打成 war 包是我当初没研究成打成 jar 的方法,最后将项目上线后,自己也反思了,回去花了半晚上的时间研究了打成 jar 包的方法,如果哪位大神有更好的方法也可以借鉴。

Keep Calm And Make Epic Shit.

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Java调用海康威视客流统计SDK可以通过以下步骤进行: 第一步是在Java项目中导入海康威视客流统计SDK的jar包文件。 第二步是在Java代码中引入SDK的相关类和方法,例如导入sdk的主类HikSDK,以及包含客流统计功能的类和方法。 第三步是实例化SDK对象,并进行初始化操作。可以使用HikSDK类的静态方法进行初始化,传入相应的参数,如设备IP地址、端口号、用户名、密码等。 第四步是进行登录认证操作。使用SDK的登录方法,传入设备信息进行认证,并获取到登录的会话ID。 第五步是选择需要进行客流统计的通道或摄像头。通过调用SDK提供的方法,选择需要进行客流统计的通道或摄像头,并设置相关参数,如统计区域、统计时间等。 第六步是启动客流统计功能。通过调用SDK方法,启动客流统计功能,并开始获取人流数据。 第七步是获取客流统计结果。通过调用SDK提供的方法,获取客流统计结果,例如获取当前时刻的人数、进出人数、累计人数等。 第八步是进行其他客流统计相关操作。根据需要,可以进行其他客流统计相关的操作,例如获取历史统计数据、设置统计参数、开关通道等。 最后一步是释放资源和关闭连接。使用SDK提供的方法,释放SDK相关资源,并关闭与设备的连接。 通过以上步骤,我们可以在Java项目中成功调用海康威视客流统计SDK,实现客流统计功能。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值