2012-10-05 188 views
1

下面的问题已被修改以缩小问题范围,ProJNA数据类型映射

我想从Java使用JNA使用原生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); 

请让我知道,如果结构*的结构内的上述映射是正确的。从DLL日志中我注意到PDU_PIN_DATA pDLCPinData具有无效值。

+0

该字段是否有无效的指针值,或PDU_PIN_DATA结构中的字段是否具有无效值。 – technomage

回答

0

DLL规范不正确。 PDU_PIN_DATA * pDLCPinData是一个指向结构数组的指针,而不是指向结构体的指针。这就是为什么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; 
0

对于本机long类型,使用NativeLong(或在Windows上为int)。 Java long是64位,这是最确定的不是你想要什么。

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

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

+0

感谢您的答复** technomage **。我使用int作为0XFFFFFFFE的无符号值,它按照我可以访问的DLL日志工作。你能否告诉我结构体*在结构体中的映射是否正确? – user1724114

+0

上述问题已被修改,重点关注结构问题中的struct *。 – user1724114

+0

谢谢Technomage,我有一个无效的指针值PDU_PIN_DATA * pDLCPinData字段eventhough我使用Structure.ByReference。我使用这种方式的方式是否正确? – user1724114

相关问题