需求

再对海康摄像头进行二次开发时,需要将海康提供的.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文件相关推荐

  1. 海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能

    海康摄像头二次开发详解 准备 海康摄像头SDK开发下载路径: 开发过程中遇到的问题记录: 添加maven依赖 下面代码中会出现的实体类 CameraManage实体类: ControlDto实体类: ...

  2. 【海康摄像头二次开发】移植海康摄像头Android SDK并实现多屏显示

    文章目录 前言 一.看海康的例程 二.重要的函数分析 HCNetSDK PlayerSDK 三.移植 1.引入库 3.写一个设备信息管理的类 4.设备登录的类 5.视频显示的控件 6.通用的工具类 7 ...

  3. 海康摄像头二次开发python_python实现海康sdk二次开发,移动侦测事件(一)

    1.概述 最近一段时间要从海康摄像头读取数据,作为程序的输入源,c++版本有海康有自己的demo,较为简单,很容易就实现了,但是为我们其他的程序都是基于python的,因此,需要使用Python调用海 ...

  4. 海康摄像头二次开发python_海康摄像头的二次开发(java)

    海康摄像头的二次开发(java) 我第一次接触海康摄像头的二次开发的项目,一开始的时候摸不清套路,走了不少弯路,现在准备把我的一些经验留下来,让大家参考一下. 1.首先到海康的官网下载设备网络SDK: ...

  5. python 海康工业相机二次开发 参数获取

    对于调用海康相机的整个流程,下面的这个博客说的很详细了,我一开始也是看的这个 python调用海康工业相机并用opencv显示(整体实现)_J&A~ing的博客-CSDN博客_python调用 ...

  6. 海康sdkC++二次开发之回放下载

    功能简介 因为项目只用到下载录像机硬盘视频的功能,所以就想找比较简单的代码,最后是在官方sdk文档的帮助文档中找到的,每个功能都有一个小示例,下面贴出来` #include <stdio.h&g ...

  7. 海康摄像头前端调用实时画面解决方案(无插件版开发)

    文章目录 前言 一.海康摄像头 二.尝试方案 1.方案1 2.方案2 3.方案3 总结 前言 项目中有一个需求,是需要把海康摄像机的实时画面在项目前端的页面中展示出来.本文的技术栈主要用到了vue3. ...

  8. 海康摄像头的二次开发(java)

    海康摄像头的二次开发(java) 我第一次接触海康摄像头的二次开发的项目,一开始的时候摸不清套路,走了不少弯路,现在准备把我的一些经验留下来,让大家参考一下. 1.首先到海康的官网下载设备网络SDK: ...

  9. 海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储

    文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131679108 红胖子(红模仿)的博文大全:开发技术集合( ...

最新文章

  1. Go的日志模块glog调研笔记
  2. 中国开源大爆发进行时,你没掉队吧?
  3. 安卓v7支持包下的ListView替代品————RecyclerView
  4. k8s管理java项目_Kubernetes集群部署项目-部署Java项目(推送镜像
  5. 我的nginx iis 负载均衡学习(环境搭建)
  6. Zabbix触发器_action动作及模板应用(二)
  7. java+getactionmap_Struts2 使用OGNL遍历map方法详解
  8. Deepin Linux已经做得相当不错了
  9. CleanCodeHandbook Chapter 7: Stack(39-41)
  10. android应用开发实验报告_聚焦 Android 11: Android 11 应用兼容性
  11. 去掉matlab图片空白边缘
  12. [深度学习概念]·主流声学模型对比
  13. 用Python绘制漫天繁星
  14. 商务办公软件应用与实践【1】
  15. 小狗AI自动建站V7 sitemap(网站地图)使用说明
  16. android计算器开发
  17. PMI考试收获的学习思维
  18. UE4-(室外光照)距离场环境光遮蔽(DFAO)
  19. 【M365运维】扩充OneDrive存储空间
  20. 1.1 Python 程序设计基本方法

热门文章

  1. MacOS设置终端代理
  2. MATLAB--数字图像处理 简单人脸识别
  3. 判断二叉树是否为满二叉树
  4. 汉诺塔问题(C语言,递归)
  5. TDD(测试驱动开发)死了吗?
  6. Allegro如何出Gerber文件
  7. Oracle EBS R12文件系统结构(学习汇总网上资料)
  8. linux free函数头文件,Linux_Linux下malloc/free与new/delete的区别,由于malloc/free是库函数,不是 - phpStudy...
  9. 软件工程导论——总体设计
  10. 都快投票了,尼日利亚大选也要推迟,是否是被操纵了?