gpt4 book ai didi

java - ProJNA 数据类型映射

转载 作者:行者123 更新时间:2023-12-01 05:05:29 25 4
gpt4 key购买 nike

下面的问题已被修改以缩小问题范围,

我正在尝试通过 JNA 使用 Java 的 native dll。我对 Java 和 JNA 都很陌生。对于对 dll 导出函数之一的特定调用,它返回无效参数。

这是结构,

PDU_RSC_DATA 是一个引用另一个结构体 PDU_PIN_DATA 的结构体,

typedef struct {
UNUM32 BusTypeId;
UNUM32 ProtocolId;
UNUM32 NumPinData;
PDU_PIN_DATA *pDLCPinData;
} PDU_RSC_DATA;

这就是 PDU_PIN_DATA 结构的样子,

typedef struct {
UNUM32 DLCPinNumber;
UNUM32 DLCPinTypeId;
} PDU_PIN_DATA;

对应的JNA映射,

public class PDU_RSC_DATA extends Structure{ 

public int BusTypeId;
public int ProtocolId;
public int NumPinData;
public Pointer pDLCPinData;

}

public class PDU_PIN_DATA extends Structure implements Structure.ByReference{

public int DLCPinNumber;
public int DLCPinTypeId;

public PDU_PIN_DATA(){

}

public PDU_PIN_DATA(Pointer ptr_PDU_PIN_DATA) {
super(ptr_PDU_PIN_DATA);
read();
}

}

native 方法 -> 已修改以方便阅读,

int _methodXYZ(PDU_RSC_DATA* obj);

Java 调用 -> 仅显示所需的代码片段,

PDU_RSC_DATA obj = new PDU_RSC_DATA();
_methodXYZ(obj);

请告诉我上述 struct* 在结构中的映射是否正确。从 DLL 日志中,我注意到 PDU_PIN_DATA pDLCPinData 的值无效。

最佳答案

使用 NativeLong(或 Windows 上的 int)作为 native long 类型。 Java long 是 64 位,这肯定不是您想要的。

编辑JNA 默认使用结构指针作为函数参数,并在结构中默认使用值结构。为了获得互补的行为,请分别使用 Structure.ByValueStructure.ByReference

如果您的结构体字段是指针,请使用实现 Structure.ByReference 的结构体版本。 JNA 通常会在 native 调用之前和之后自动处理 native 内存与 java 字段的同步。

关于java - ProJNA 数据类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12754490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com