jna中出现错误解决方案
为什么会出现这些错误之JNA版本的锅
可能是我们在参考或使用一些老的项目提供的demo时候,用到了jna版本比较低。比如海康的SDK或者一些星浩喇叭的SDK需要和设备对接的项目等…
不要手动导入jar包,使用maven
好处是不用自己打入包,第二就是老版本中提供的jna没有支持像:linux-aarch64这种版本。
<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.14.0</version>
</dependency>
切换高版本会出现的错误
Structure.getFieldOrder() on class 错误
原因: 高版本需要重写getFieldOrder()方法
报什么错,你就按照报错的顺序在对应的静态类中加上
这里我遇到一个坑就是加上@Structure.FieldOrder({})后发现解析的数据对不上。如果你也遇到了,请一定安装类中属性顺序去写。特别是星浩的喇叭!
@Structure.FieldOrder({"xxx1", "xxx2" })
以下是一个示例:
@Structure.FieldOrder({"AlmInMask", "AlmInState", "AlmOutMask", "AlmOutState", "dwTermID", "eTermState"})
public static class TSdkPostTermState extends Structure {
public int dwTermID;
public int eTermState;
public byte AlmInMask;
public byte AlmInState;
public byte AlmOutMask;
public byte AlmOutState;
}
新增第二种解决方案。对于无法使用注解的形式:直接重写其方法
public static class TSdkTime extends Structure {
public short Year; // 年 : 2018 ~ 2999
public byte Month; // 月 : 1 ~ 12
public byte Day; // 日 : 1 ~ 31
public short Hour; // 时 : 0 ~ 23
public byte Minute; // 分 : 0 ~ 59
public byte Second; // 秒 : 0 ~ 59
public int MillSecond; // 毫秒 : 0 ~ 999
@Override
public List getFieldOrder(){
return Arrays.asList("Year", "Month", "Day", "Hour", "Minute", "Second", "MillSecond");
}
}
java.lang.IllegalArgumentException: Invalid calling convention 63 错误
原因:
1、接口继承了StdCallLibrary,而不是Library。
2、接口中用到了回调函数,回调函数继承了StdCallLibrary.StdCallCallback。
简单来说就是你开发平台是windows,你的线上环境是linux
错误示例:
#错误示例
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
public interface CtsSdk extends StdCallLibrary {
public interface OnCtsSdkCallBack extends StdCallCallback {
public int invoke(int eCbType, Pointer pParam, int dwSize, int usr_data) throws IOException, ClassNotFoundException;
}
}
正确示例:
#正确示例
public interface CtsSdk extends Library {
public interface OnCtsSdkCallBack extends Callback {
public int invoke(int eCbType, Pointer pParam, int dwSize, int usr_data) throws IOException, ClassNotFoundException;
}
}
#参考
jna实战,部署踩坑