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, Pointer 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 で無効な *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 マッピングが原因ではないかと疑っています。アイデアや提案があれば教えてください。ありがとう

4

1 に答える 1

0

a内のプリミティブ配列Structureはインライン配列として解釈され、集約(配列)型のフィールドになります。ネイティブ構造はこれらのフィールドのポインター型を示しているため、Pointer、PointerType、またはNIOBufferを使用する必要があります。

于 2012-11-22T12:43:36.277 に答える