海康摄像头二次开发动态配置.dll与.so文件
需求
再对海康摄像头进行二次开发时,需要将海康提供的.dll(window)文件或.so(linux)文件通过路径的方式进行配置,项目在window上开发.在linux上进行部署,另一方面在linux上是通过jar包部署,无法直接获取到jar中.dll与.so文件的路径,需做成自动获取
问题
1.获取jar包中的指定的文件
2.如何填写有效的文件路径
通过jar包启动
获取jar包的路径,通过JarFile解析jar包,获取到想要的数据.复制到对应的文件夹下,将路径返回
代码
//通过jar包启动public static String getLibraryPath(String type, String name) {String fileName = null;URL url= Application.class.getProtectionDomain().getCodeSource().getLocation();//获取jar包的路径try{//转化为utf-8编码,支持中文String path= URLDecoder.decode(url.getPath(),"utf-8");if(path.startsWith("file:")) {//判断是什么系统if (SystemUtils.name().equals("windows")) {path = path.replace("file:/", "");} else if (SystemUtils.name().equals("linux")) {path = path.replace("file:", "");}}if(path.contains(".jar!/")) {path = path.substring(0, path.indexOf(".jar!/")+4);//去掉后缀}
// System.out.println(path);File file = new File(new File(path).getParentFile() + File.separator + type);//当前jar下新增目录if (!file.exists()) {JarFile jarFile = new JarFile(path);Enumeration<JarEntry> entryes = jarFile.entries();while (entryes.hasMoreElements()) {JarEntry entry = entryes.nextElement();if (entry.getName().startsWith("BOOT-INF/classes/" + type)) {//BOOT-INF/classes/linux开头String replace = entry.getName().replace("BOOT-INF/classes/", "");System.out.println(replace);if (!replace.endsWith("/")){ //去掉只有文件夹FileCopyUtils.copy(replace);}}}}fileName = file.getPath() + File.separator + name;
// System.out.println("fileName=" + fileName);}catch(Exception e){e.printStackTrace();}return fileName;}
package cn.daming.box.common.utils;import org.apache.commons.io.IOUtils;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;public class FileCopyUtils {private static InputStream getResource(String location) throws IOException {PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();InputStream in = resolver.getResource(location).getInputStream();byte[] byteArray = IOUtils.toByteArray(in);in.close();return new ByteArrayInputStream(byteArray);}/*** 获取项目所在文件夹的绝对路径* @return*/private static String getCurrentDirPath() {URL url = org.springframework.util.FileCopyUtils.class.getProtectionDomain().getCodeSource().getLocation();String path = url.getPath();if(path.startsWith("file:")) {path = path.replace("file:", "");}if(path.contains(".jar!/")) {path = path.substring(0, path.indexOf(".jar!/")+4);}File file = new File(path);path = file.getParentFile().getAbsolutePath();return path;}private static Path getDistFile(String path) throws IOException {String currentRealPath = getCurrentDirPath();Path dist = Paths.get(currentRealPath + File.separator + path);Path parent = dist.getParent();if(parent != null) {Files.createDirectories(parent);}Files.deleteIfExists(dist);return dist;}/*** 复制classpath下的文件到jar包的同级目录下* @param location 相对路径文件,例如kafka/kafka_client_jaas.conf* @return* @throws IOException*/public static String copy(String location) throws IOException {InputStream in = getResource("classpath:"+location);Path dist = getDistFile(location);Files.copy(in, dist);in.close();return dist.toAbsolutePath().toString();}
}
不通过jar包启动
通过开发工具启动,实现自动识别路径.需要复制到一个固定的地址.
在标准SDK中提供了java.lang.System类,这个类定义了一个对系统设备(包括系统属性和系统输入输出数据流)的、与平台无关的接口。如果我们想获取JVM的系统属性,就需要用到该类的getProperty()方法。该方法可以获取系统(JVM)的配置信息。
String library = java.lang.System.getProperty(“java.library.path”);
String[] librarys = library.split(";");
String libraryP1 = librarys[0]
Key | Description of Associated Value | 中文描述 |
---|---|---|
java.version | Java Runtime Environment version | Java 运行时环境版本 |
java.vendor | Java Runtime Environment vendor | Java 运行时环境供应商 |
java.vendor.url | Java vendor URL | Java 供应商的 URL |
java.home | Java installation directory | Java 安装目录 |
java.vm.specification.version | Java Virtual Machine specification version | Java 虚拟机规范版本 |
java.vm.specification.vendor | Java Virtual Machine specification vendor | Java 虚拟机规范供应商 |
java.vm.specification.name | Java Virtual Machine specification name | Java 虚拟机规范名称 |
java.vm.version | Java Virtual Machine implementation version Java | 虚拟机实现版本 |
java.vm.vendor | Java Virtual Machine implementation vendor | Java 虚拟机实现供应商 |
java.vm.name | Java Virtual Machine implementation name | Java 虚拟机实现名称 |
java.specification.version | Java Runtime Environment | specification version Java 运行时环境规范版本 |
java.specification.vendor | Java Runtime Environment | specification vendor Java 运行时环境规范供应商 |
java.specification.name | Java Runtime Environment | specification name Java 运行时环境规范名称 |
java.class.version | Java class format version number | Java 类格式版本号 |
java.class.path | Java class path | Java 类路径 |
java.library.path | List of paths to search when loading libraries | 加载库时搜索的路径列表 |
java.io.tmpdir | Default temp file path | 默认的临时文件路径 |
java.compiler | Name of JIT compiler to use | 要使用的 JIT 编译器的名称 |
java.ext.dirs | Path of extension directory or directories | 一个或多个扩展目录的路径 |
os.name | Operating system name | 操作系统的名称 |
os.arch | Operating system architecture | 操作系统的架构 |
os.version | Operating system version | 操作系统的版本 |
file.separator | File separator ("/" on UNIX) | 文件分隔符(在 UNIX 系统中是“/”) |
path.separator | Path separator (":" on UNIX) | 路径分隔符(在 UNIX 系统中是“:”) |
line.separator | Line separator ("\n" on UNIX) | 行分隔符(在 UNIX 系统中是“/n”) |
user.name | User’s account name | 用户的账户名称 |
user.home | User’s home directory | 用户的主目录 |
user.dir | User’s current working directory | 用户的当前工作目录 |
代码
public static String getLibraryPath(String type, String name) {// root pathString library = java.lang.System.getProperty("java.library.path");String[] librarys = library.split(";");String temPath = "";if(librarys != null && librarys.length > 0) {String libraryP1 = librarys[0];temPath = libraryP1 + File.separator + type;//系统下的目录文件
// System.out.println("temPath=" + temPath);if(!new File(temPath).exists()) {try {FileUtils.copy("src/main/resources" + File.separator + type,temPath);} catch (Exception e) {e.printStackTrace();}}}return temPath + File.separator + name;
}
修改海康sdk
public static WinHCSadpSDK instance() {/*** 以下加载资源文件方法兼容window、linux,同时支持在IDE工具下或者jar环境下使用*/String temPath = null;if (SystemUtils.name().equals("windows")) {temPath = LibraryUtils.getLibraryPath("window", "Sadp.dll");} else if (SystemUtils.name().equals("linux")) {temPath = LibraryUtils.NewgetLibraryPath("linux", "libsadp.so");}// 加载LibraryPath下资源文件WinHCSadpSDK INSTANCE = (WinHCSadpSDK) Native.loadLibrary(temPath, WinHCSadpSDK.class);return INSTANCE;}
海康摄像头二次开发动态配置.dll与.so文件相关推荐
- 海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能
海康摄像头二次开发详解 准备 海康摄像头SDK开发下载路径: 开发过程中遇到的问题记录: 添加maven依赖 下面代码中会出现的实体类 CameraManage实体类: ControlDto实体类: ...
- 【海康摄像头二次开发】移植海康摄像头Android SDK并实现多屏显示
文章目录 前言 一.看海康的例程 二.重要的函数分析 HCNetSDK PlayerSDK 三.移植 1.引入库 3.写一个设备信息管理的类 4.设备登录的类 5.视频显示的控件 6.通用的工具类 7 ...
- 海康摄像头二次开发python_python实现海康sdk二次开发,移动侦测事件(一)
1.概述 最近一段时间要从海康摄像头读取数据,作为程序的输入源,c++版本有海康有自己的demo,较为简单,很容易就实现了,但是为我们其他的程序都是基于python的,因此,需要使用Python调用海 ...
- 海康摄像头二次开发python_海康摄像头的二次开发(java)
海康摄像头的二次开发(java) 我第一次接触海康摄像头的二次开发的项目,一开始的时候摸不清套路,走了不少弯路,现在准备把我的一些经验留下来,让大家参考一下. 1.首先到海康的官网下载设备网络SDK: ...
- python 海康工业相机二次开发 参数获取
对于调用海康相机的整个流程,下面的这个博客说的很详细了,我一开始也是看的这个 python调用海康工业相机并用opencv显示(整体实现)_J&A~ing的博客-CSDN博客_python调用 ...
- 海康sdkC++二次开发之回放下载
功能简介 因为项目只用到下载录像机硬盘视频的功能,所以就想找比较简单的代码,最后是在官方sdk文档的帮助文档中找到的,每个功能都有一个小示例,下面贴出来` #include <stdio.h&g ...
- 海康摄像头前端调用实时画面解决方案(无插件版开发)
文章目录 前言 一.海康摄像头 二.尝试方案 1.方案1 2.方案2 3.方案3 总结 前言 项目中有一个需求,是需要把海康摄像机的实时画面在项目前端的页面中展示出来.本文的技术栈主要用到了vue3. ...
- 海康摄像头的二次开发(java)
海康摄像头的二次开发(java) 我第一次接触海康摄像头的二次开发的项目,一开始的时候摸不清套路,走了不少弯路,现在准备把我的一些经验留下来,让大家参考一下. 1.首先到海康的官网下载设备网络SDK: ...
- 海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储
文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131679108 红胖子(红模仿)的博文大全:开发技术集合( ...
最新文章
- Go的日志模块glog调研笔记
- 中国开源大爆发进行时,你没掉队吧?
- 安卓v7支持包下的ListView替代品————RecyclerView
- k8s管理java项目_Kubernetes集群部署项目-部署Java项目(推送镜像
- 我的nginx iis 负载均衡学习(环境搭建)
- Zabbix触发器_action动作及模板应用(二)
- java+getactionmap_Struts2 使用OGNL遍历map方法详解
- Deepin Linux已经做得相当不错了
- CleanCodeHandbook Chapter 7: Stack(39-41)
- android应用开发实验报告_聚焦 Android 11: Android 11 应用兼容性
- 去掉matlab图片空白边缘
- [深度学习概念]·主流声学模型对比
- 用Python绘制漫天繁星
- 商务办公软件应用与实践【1】
- 小狗AI自动建站V7 sitemap(网站地图)使用说明
- android计算器开发
- PMI考试收获的学习思维
- UE4-(室外光照)距离场环境光遮蔽(DFAO)
- 【M365运维】扩充OneDrive存储空间
- 1.1 Python 程序设计基本方法
热门文章
- MacOS设置终端代理
- MATLAB--数字图像处理 简单人脸识别
- 判断二叉树是否为满二叉树
- 汉诺塔问题(C语言,递归)
- TDD(测试驱动开发)死了吗?
- Allegro如何出Gerber文件
- Oracle EBS R12文件系统结构(学习汇总网上资料)
- linux free函数头文件,Linux_Linux下malloc/free与new/delete的区别,由于malloc/free是库函数,不是 - phpStudy...
- 软件工程导论——总体设计
- 都快投票了,尼日利亚大选也要推迟,是否是被操纵了?