JNA:指向Struct数组的指针:无效指针

时间:2012-11-22 05:08:05

标签: java pointers dll structure jna

我是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 Mapping:

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方法并查看underlyng dll日志时,我看到对于PDU_COP_CTRL_DATA结构字段* pExpectedResponseArray我得到无效* PDU_EXP_RESP_DATA指针。

用于设置PDUStartComPrimitive执行的JNA代码

        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映射。你有没有可以帮我提出任何想法/建议。 谢谢

1 个答案:

答案 0 :(得分:0)

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