ProJNA数据类型映射

时间:2012-10-05 21:46:56

标签: java jna

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

我正在尝试使用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 的值无效。

2 个答案:

答案 0 :(得分:0)

使用NativeLong(或Windows上的int)作为原生long类型。 Java long是64位,最确定不是你想要的。

修改 JNA默认使用结构指针作为函数参数,默认情况下在结构中按值结构。为了获得互补行为,请分别使用Structure.ByValueStructure.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;