海康 Java SDK 升级 JNA 版本
海康 Java SDK 依赖 JNA 3.0.9,业务中已经使用了更高版本的 JNA,所以需要升级,记录一下从 JNA 3.0.9 升级 JNA 5.15.0 的方法。
海康 Java SDK 核心类是 HCNetSDK,JNA 升级需要处理继承自 com.sun.jna.Structure 类,覆盖 getFieldOrder 方法。一个个改是极不方便的,所以参考大华定义一个 SdkStructure 类来继承 Structure 并覆盖 getFieldOrder 方法,然后将继承 Structure 的类改为继承 SdkStructure 。下面是具体步骤:
- 打开 HCNetSDK.java 类,将 Structure 替换成 SdkStructure
- 将 SdkStructure 类定义放到 1147 行。位置可随意,只是1147 行前面都是常量定义,1147 开始是类定义。
class SdkStructure extends Structure { @Override protected List<String> getFieldOrder() { List<String> fieldOrderList = new ArrayList<>(); for (Class<?> clazz = getClass(); !clazz.equals(SdkStructure.class); clazz = clazz.getSuperclass()) { Field[] fields = clazz.getDeclaredFields(); int modifiers; for (Field field : fields) { modifiers = field.getModifiers(); if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) { continue; } fieldOrderList.add(field.getName()); } } return fieldOrderList; } @Override public int fieldOffset(String name) { return super.fieldOffset(name); } }
- 修改 PlayCtrl.FRAME_INFO,继承 HCNetSDK.SdkStructure