jna中出现错误解决方案
- 为什么会出现这些错误之JNA版本的锅
- 不要手动导入jar包,使用maven
- 切换高版本会出现的错误
- Structure.getFieldOrder() on class 错误
- java.lang.IllegalArgumentException: Invalid calling convention 63 错误
为什么会出现这些错误之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; }
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实战,部署踩坑