以下问题已经过修改,以缩小问题范围,
我正在尝试使用JNA使用Java中的本机dll。我是Java和JNA的新手。对于其中一个dll导出函数的特定调用,它将返回无效参数。
以下是结构,
PDU_RSC_DATA是一个引用另一个struct 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();
}
}
原生方法 - >修改后易于阅读,
int _methodXYZ(PDU_RSC_DATA* obj);
Java调用 - >只显示所需的片段,
PDU_RSC_DATA obj = new PDU_RSC_DATA();
_methodXYZ(obj);
如果结构中struct *的上述映射是正确的,请告诉我。从DLL日志中我注意到 PDU_PIN_DATA pDLCPinData 的值无效。
答案 0 :(得分:0)
使用NativeLong
(或Windows上的int
)作为原生long
类型。 Java long
是64位,最确定不是你想要的。
修改强>
JNA默认使用结构指针作为函数参数,默认情况下在结构中按值结构。为了获得互补行为,请分别使用Structure.ByValue
和Structure.ByReference
。
如果您的结构字段是指针,请使用实现Structure.ByReference
的结构版本。 JNA通常会在本机调用之前和之后自动处理本机内存与java字段的同步。
答案 1 :(得分:0)
DLL规范不正确。 PDU_PIN_DATA * pDLCPinData 是指向结构数组的指针,而不是指向struct的指针。这就是为什么technomage的建议din工作。这是我的问题。 再次感谢technomage。
这是我如何为结构数组赋值,它工作正常。我也修改了问题中的PDU_RSC_DATA结构。
PDU_RSC_DATA pRscData = new PDU_RSC_DATA();
pRscData.BusTypeId = 1;
pRscData.ProtocolId = 7;
pRscData.NumPinData = 2;
PDU_PIN_DATA pDLCPinData = new PDU_PIN_DATA();
PDU_PIN_DATA[] pDLCPinDataArray= (PDU_PIN_DATA[])pDLCPinData.toArray(pRscData.NumPinData);
pDLCPinDataArray[0].DLCPinNumber = 6;
pDLCPinDataArray[0].DLCPinTypeId = 1;
pDLCPinDataArray[1].DLCPinNumber = 14;
pDLCPinDataArray[1].DLCPinTypeId = 2;
pDLCPinData.autoWrite();
Pointer ptr_pDLCPinData = pDLCPinData.getPointer();
pRscData.pDLCPinData = ptr_pDLCPinData;