天天看點

基于海康windows下的.dll和Linux下的.so動态庫調用基于海康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的同級目錄,建立了一個檔案夾)
    基于海康windows下的.dll和Linux下的.so動态庫調用基于海康windows下的.dll和Linux下的.so動态庫調用

三、調用需要修改的地方

  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上面直接複制到另一個上面,這樣路徑是不對的(會有一個引用),需要從新導入一個新的上去

繼續閱讀