java - 如何使用 JNA 将带有数组 [1+1] 的结构和带有 FAR PASCAL 的方法从 C 映射到 Java?
问题描述
我需要创建 Java 接口来调用 DLL 中的方法。我不确定下面的java代码是否正确。
我已经在使用 JNA 5.4 和 Java 11。
C中的结构:
typedef struct
{
char CarId[8 + 1];
char CarCode[5 + 1];
char PrimaCarStatus[24 + 1];
}Cars;
C中的方法:
extern "C" __int32 _stdcall FAR PASCAL DG18_Search(Cars *CarsData);
它应该看起来像这样吗?
Java 类
public class Cars extends Struct {
public byte carId[] = new byte[8];
public byte carCode[] = new byte[5];
public byte primaCarStatus[] = new byte[24];
}
Java方法
public int DG18_Search(Pointer pointer);
C 中的 array[1+1] 和 FAR PASCAL 到底是什么意思?
解决方案
欢迎来到 StackOverflow,JustCoding。
您看到的 +1 只是简单的加法,因此您需要在字节数组的值中添加 1 才能正确映射。我怀疑 +1 是为了表明有一定数量的 1 字节字符的空间,如果需要,再加一个空格作为空终止符。
但是,您的映射 Java 语法是错误的,您需要声明数组类型,因此正确的映射是:
public class Cars extends Structure {
public byte[] carId = new byte[9];
public byte[] carCode = new byte[6];
public byte[] primaCarStatus = new byte[25];
}
(或者,如果您愿意,可以保留8 + 1
样式编号。)注意要扩展的 JNA 类Structure
不是Struct
.
至于函数/方法映射,您可以阅读 Fifi 关于 FAR PASCAL 的链接,但除非您正在构建真正古老的操作系统,否则您可以放心地忽略它们。虽然 aPointer
适用于映射,但它允许您将任何指针或结构传递给该方法。最好使用类型安全并将Cars
变量放在该函数调用中:JNA 将自动Cars.ByReference
在方法参数中使用结构的指针 (),并将结果自动读入您的局部变量,因此:
public int DG18_Search(Cars cars);
推荐阅读
- java - 使用 Java 9 及更高版本(在本例中为 JDK11)部署 JAR(JLink 混淆?)
- typescript - 强制数组在 Typescript 中至少有一个值
- enums - Swig:如何为 Tcl 编写包装器代码以将枚举类型的成员映射为字符串常量
- r - R箱线图,使用“stat_compare_means”更改p值中的位数
- c++ - 将 C/C++ 套接字传递给 EM_ASM 以在 Emscripten 中用作 websocket
- google-cloud-platform - 尝试部署到 Google Cloud Run 时出现权限错误
- r - 从 prj4string 获取 CRS
- react-native - 绝对位置在 React Native 中的 ScrollView 中不起作用
- javascript - 无法手动或自动构建 main.jsbundle 文件
- c++ - 如何配置 c++ Zbar 扫描仪仅解码 QR-Code 数据类型?