下面的问题已经被修改以缩小范围,
我试图使用JNA使用Java中的本机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();
}
}本机方法->为便于阅读而修改,
int _methodXYZ(PDU_RSC_DATA* obj);Java调用->只显示所需的片段,
PDU_RSC_DATA obj = new PDU_RSC_DATA();
_methodXYZ(obj);请告诉我上面对struct*的映射是否正确。从DLL日志中,我注意到PDU_PIN_DATA pDLCPinData的值无效。
发布于 2012-10-08 22:16:42
DLL规范不正确。PDU_PIN_DATA *pDLCPinData是指向结构数组的指针,而不是指向结构的指针。这就是为什么科技公司的建议在起作用。从我的角度来看,这是个问题。再次感谢技术.
下面是如何将值赋值给struct数组,它工作得很好。我在问题中也修改了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;发布于 2012-10-06 12:44:10
对本机NativeLong类型使用int (或Windows上的int)。Java long是64位,这肯定不是您想要的。
编辑 JNA在默认情况下对函数参数使用结构指针,在结构中默认使用值结构。为了得到互补行为,分别使用Structure.ByValue和Structure.ByReference。
如果您的结构字段是指针,请使用实现Structure.ByReference的结构版本。JNA通常会在本机调用之前和之后自动将本机内存同步到java字段。
https://stackoverflow.com/questions/12754490
复制相似问题