1

我是 JNA 的新手,在指针映射方面遇到问题

本机方法:

  • EXTERNC T_PDU_ERROR PDUStartComPrimitive(UNUM32 hMod,UNUM32 hCLL,T_PDU_COPT CopType,UNUM32 CoPDataSize,UNUM8
    *pCopData,PDU_COP_CTRL_DATA *pCopCtrlData, void *pCopTag, UNUM32 *phCoP)

JNA 方法:

  • int PDUStartComPrimitive(int hMod,int hCLL,int CoPType,int
    CoPDataSize,byte[] pCoPData,PDU_COP_CTRL_DATA.ByReference
    pCopCtrlData,指针 pCoPTag,IntByReference phCoP);

原生结构:

typedef struct{
UNUM32 Time;
SNUM32 NumSendCycles;
SNUM32 NumReceiveCycles;
UNUM32 TempParamUpdate;
PDU_FLAG_DATA TxFlag;
UNUM32 NumPossibleExpectedResponses;
PDU_EXP_RESP_DATA *pExpectedResponseArray;
}PDU_COP_CTRL_DATA;

typedef struct{
UNUM32 ResponseType;
UNUM32 AcceptanceId;
UNUM32 NumMaskPatternBytes;
UNUM8 *pMaskData;   
UNUM8 *pPatternData;    
UNUM32 NumUniqueRespIds;
UNUM32 *pUniqueRespIds; 
}PDU_EXP_RESP_DATA;

JNA 映射:

public class PDU_COP_CTRL_DATA extends Structure{       
    public int time;        
    public int numSendCycles;       
    public int numReceiveCycles;        
    public int tempParamUpdate;     
    public PDU_FLAG_DATA txFlag;        
    public int numPossibleExpectedResponses;        
    public Pointer pExpectedResponseArray;      
    public static class ByReference extends PDU_COP_CTRL_DATA implements     Structure.ByReference {
    };
}

public class PDU_EXP_RESP_DATA extends Structure{        
     public int responseType;        
     public int acceptanceId;
     public int numMaskPatternBytes;
     public byte[] pMaskData= new byte[1];
     public byte[] pPatternData = new byte[1];
     public int numUniqueRespIds;
     /* Array containing unique response identifiers. Only responses with a unique response identifier found in this array are considered, when trying to match them to this expected response. */
     public Pointer pUniqueRespIds;  
     public static class ByReference extends PDU_EXP_RESP_DATA implements Structure.ByReference {
     };
}   

当我在 Java 中执行 PDUStartComPrimitive 方法并查看底层 dll 日志时,我看到 PDU_COP_CTRL_DATA 结构字段 *pExpectedResponseArray 我得到 Invalid *PDU_EXP_RESP_DATA 指针。

我的 JNA 代码来设置 PDUStartComPrimitive 执行

        byte[] sendata = new byte[requestData.length() / 2];

        int byteIndex = 0;
        for (String byteString : requestData.split(" ")) {
            sendata[byteIndex] = Byte.parseByte(byteString, 16);
            byteIndex++;
        }
        /* Setting of the expected responses ends */

        PDU_COP_CTRL_DATA.ByReference objCopCtrlData = new PDU_COP_CTRL_DATA.ByReference();
        objCopCtrlData.numPossibleExpectedResponses = 1;
        objCopCtrlData.numReceiveCycles = 1;
        objCopCtrlData.numSendCycles = 1;
        objCopCtrlData.tempParamUpdate = 0;
        objCopCtrlData.time = 0;


        PDU_EXP_RESP_DATA expRespStruct = new PDU_EXP_RESP_DATA();

        expRespStruct.acceptanceId = 0;
        expRespStruct.numMaskPatternBytes = 1;
        expRespStruct.numUniqueRespIds = 0;
        expRespStruct.pUniqueRespIds = new Pointer(0);
        expRespStruct.responseType = 0;

        byte[] mskByte = byte int[] { 0 };
        byte[] patternByte = new byte[] { 0 };
        expRespStruct.pMaskData = mskByte;
        expRespStruct.pPatternData = patternByte;

        PDU_EXP_RESP_DATA[] refArr = (PDU_EXP_RESP_DATA[]) expRespStruct.toArray(1);
        refArr[0] = expRespStruct;

        expRespStruct.autoWrite();

        objCopCtrlData.pExpectedResponseArray = expRespStruct.getPointer();

        PDU_FLAG_DATA.ByValue objTxFlagData = new PDU_FLAG_DATA.ByValue();          
        objCopCtrlData.txFlag = objTxFlagData;

        String strComAction = "SEND_RECV";
        Pointer apiTag = new NativeString(strComAction, true).getPointer();
        IntByReference phCop = new IntByReference();

        int errorCode = PDUStartComPrimitive(1, 1,0x8004, sendata.length,sendata, objCopCtrlData, apiTag, phCop);

我怀疑这可能是因为错误的 JNA 映射。你能帮我提出任何想法/建议吗?谢谢

4

1 回答 1

0

a 中的原始数组Structure被解释为内联数组,这会产生聚合(数组)类型的字段。您的本机结构指示这些字段的指针类型,因此您需要使用 Pointer、PointerType 或 NIO Buffer。

于 2012-11-22T12:43:36.277 回答