基于海康windows下的.dll和Linux下的.so動态庫調用
上一篇:基于海康SDK開發文檔分析+雲台控制實作+經典案例
最近在做海康攝像頭的二次開發,在将項目部署在Linux上面的時候遇到了調用動态庫的問題,下面隻解釋怎樣去調用
一、windoes和Linux下調用動态庫
- windows下支援的動态庫為以.dll結尾的(還有其他的) 而Linux下是不支援的,Linux下支援的動态庫為.so(還有其他的)
- windows下調用動态庫的方法已經在上一篇中寫出來了,隻需要在啟動的時候去指定動态庫的位置就好了。
- 而Linux調用的原理是一樣的,但是又和Windows是有差別的。
二、Linux下調用動态庫準備
- 環境:我是因為在windows下進行開發,是以像上一篇中那樣調用時沒問題的,但是當我項目部署到Linux下調用就是不支援的
- 準備:下載下傳海康的Linux版本的SDK
- 找到lib(存放動态庫的地方)
- 将改動态庫放到Linux下(我放到和項目的jar的同級目錄,建立了一個檔案夾)
三、調用需要修改的地方
- 指定加載動态庫的路徑的時候需要做修改
//這是指定動态庫加載的地方
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";
}
}
- 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);
}
- 如果啟動還是報錯,應該是路徑不對,核對一下路徑( 最好用日志列印出全路徑),然後看路徑是不是正确的。
- 不要從一個Linux上面直接複制到另一個上面,這樣路徑是不對的(會有一個引用),需要從新導入一個新的上去