如果使用海康威视是的JAVA版本SDK在windows下运行没问题,但到了linux下怎么部署都有错误,有两个注意的地方
一个是库文件是否位置正确,能够被正确加载。
另外一个是最坑的,海康用的jna的jar包版本太旧,导致继承Structure类的HCNetSDK.java中的子类文件都有问题,缺少了getFieldOrder方法,解决的办法也很简单,写个类继承Structure,然后重写getFieldOrder方法。
代码如下:
import com.sun.jna.Structure;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
public class MyStructure extends Structure {
protected List<String> getFieldOrder(){
List<String> fieldOrderList = new ArrayList<String>();
for (Class<?> cls = getClass();
!cls.equals(Structure.class);
cls = cls.getSuperclass()) {
Field[] fields = cls.getDeclaredFields();
int modifiers;
for (Field field : fields) {
modifiers = field.getModifiers();
if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
continue;
}
fieldOrderList.add(field.getName());
}
}
return fieldOrderList;
}
}
然后修改HCNetSDK.java中所有继承Structure的类改为extends MyStructure
例如:
//校时结构参数
public static class NET_DVR_TIME extends MyStructure {//校时结构参数
public int dwYear; //年
public int dwMonth; //月
public int dwDay; //日
public int dwHour; //时
public int dwMinute; //分
public int dwSecond; //秒
public String toString() {
return "NET_DVR_TIME.dwYear: " + dwYear + "\n" + "NET_DVR_TIME.dwMonth: \n" + dwMonth + "\n" + "NET_DVR_TIME.dwDay: \n" + dwDay + "\n" + "NET_DVR_TIME.dwHour: \n" + dwHour + "\n" + "NET_DVR_TIME.dwMinute: \n" + dwMinute + "\n" + "NET_DVR_TIME.dwSecond: \n" + dwSecond;
}
//用于列表中显示
public String toStringTime() {
return String.format("%02d/%02d/%02d%02d:%02d:%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
}
//存储文件名使用
public String toStringTitle() {
return String.format("Time%02d%02d%02d%02d%02d%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
}
}