【问题标题】:How to map struct wtih array[1+1] and method with FAR PASCAL from C to Java using JNA?如何使用 JNI 将带有数组 [1+1] 的结构和带有 FAR PASCAL 的方法从 C 映射到 Java?
【发布时间】:2019-08-05 14:03:06
【问题描述】:

我需要创建 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); 

array[1+1] 和 FAR PASCAL 在 C 中究竟是什么意思?

【问题讨论】:

标签: java c jna


【解决方案1】:

欢迎来到 StackOverflow,JustCoding

您看到的 +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 的链接,但除非您正在构建真正古老的操作系统,否则您可以放心地忽略它们。虽然 Pointer 可以用于映射,但它允许您将任何指针或结构传递给该方法。最好使用类型安全并将Cars 变量放在该函数调用中:JNA 将自动在方法参数中使用结构的指针(Cars.ByReference),并将结果自动读取到您的局部变量中,所以:

public int DG18_Search(Cars cars); 

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2022-01-18
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多