1

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

我正在尝试使用 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 Mapping,

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的值无效。

4

2 回答 2

0

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

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

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

于 2012-10-06T12:44:10.710 回答
0

DLL 规范不正确。PDU_PIN_DATA *pDLCPinData是指向结构数组的指针,而不是指向结构的指针。这就是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;
于 2012-10-08T22:16:42.743 回答