基于海康windows下的.dll和Linux下的.so动态库调用

基于海康windows下的.dll和Linux下的.so动态库调用

上一篇:基于海康SDK开发文档分析+云台控制实现+经典案例

最近在做海康摄像头的二次开发,在将项目部署在Linux上面的时候遇到了调用动态库的问题,下面只解释怎样去调用

一、windoes和Linux下调用动态库

  1. windows下支持的动态库为以.dll结尾的(还有其他的) 而Linux下是不支持的,Linux下支持的动态库为.so(还有其他的)
  2. windows下调用动态库的方法已经在上一篇中写出来了,只需要在启动的时候去指定动态库的位置就好了。
  3. 而Linux调用的原理是一样的,但是又和Windows是有区别的。

二、Linux下调用动态库准备

  1. 环境:我是因为在windows下进行开发,所以像上一篇中那样调用时没问题的,但是当我项目部署到Linux下调用就是不支持的
  2. 准备:下载海康的Linux版本的SDK
  3. 找到lib(存放动态库的地方)
  4. 将改动态库放到Linux下(我放到和项目的jar的同级目录,新建了一个文件夹)
    在这里插入图片描述

三、调用需要修改的地方

  1. 指定加载动态库的路径的时候需要做修改
//这是指定动态库加载的地方
	HCNetSDK INSTANCE =(HCNetSDK) Native.synchronizedLibrary(
            (HCNetSDK) Native.loadLibrary(PathUtil.getSDKJarPath(),HCNetSDK.class));
      在Linux下面的 “/” 最好用 File.separator 代替
//这是上面PathUtil.getSDKJarPath()方法
    public static String getSDKJarPath() {
        String osName = System.getProperties().getProperty("os.name");
        if (osName.equals(LINUX)) {
//            return System.getProperty("java.class.path").replace("/env.jar", "") + File.separator + "HCNetLib" + File.separator + "libhcnetsdk.so";
            return ENV + File.separator + "HCNetLib" + File.separator + "libhcnetsdk.so";
        } else {
            return System.getProperty("user.dir") + "\\camera\\sdklib\\HCNetSDK";
        }
    }
  1. HCNetSDK.java接口修改
public interface HCNetSDK extends Library{ //Windows系统下是StdCallLibrary

      HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK", HCNetSDK.class);
//回调函数的约定也是一样的,需要修改,比如:

public static interface FRealDataCallBack_V30 extends Callback { //Windows系统下是StdCallCallback

       public void invoke(NativeLong lRealHandle, int dwDataType,

               ByteByReference pBuffer, int dwBufSize, Pointer pUser);

}
  1. 如果启动还是报错,应该是路径不对,核对一下路径( 最好用日志打印出全路径),然后看路径是不是正确的。
  2. 不要从一个Linux上面直接复制到另一个上面,这样路径是不对的(会有一个引用),需要从新导入一个新的上去
发布了15 篇原创文章 · 获赞 5 · 访问量 5412

猜你喜欢

转载自blog.csdn.net/weixin_43718192/article/details/95360791