首页 > 解决方案 > 如何使用 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 到底是什么意思?

标签: javacjna

解决方案


欢迎来到 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); 

推荐阅读