2012-10-05 232 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

相關問題