1

以下の質問は、問題を絞り込むために修正されました。

JNA を使用して Java からネイティブ dll を使用しようとしています。私はJavaとJNAの両方が初めてです。dll のエクスポートされた関数の 1 つに対する特定の呼び出しでは、無効なパラメーターが返されます。

構造体は次のとおりです。

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);

上記の struct* 内の構造体のマッピングが正しいかどうか教えてください。DLL ログから、PDU_PIN_DATA pDLCPinDataの値が無効であることがわかりました。

4

2 に答える 2

0

ネイティブタイプにNativeLong(またはWindows で)使用します。Java64 ビットです。intlonglong

EDIT JNA は、デフォルトで関数の引数に構造体ポインターを使用し、構造体内ではデフォルトで値によって構造体を使用します。補完的な動作を得るには、それぞれ と を使用Structure.ByValueStructure.ByReferenceます。

構造体フィールドがポインタの場合は、 を実装する構造体のバージョンを使用してくださいStructure.ByReference。JNA は通常、ネイティブ呼び出しの前後にネイティブ メモリを Java フィールドに同期することを自動的に処理します。

于 2012-10-06T12:44:10.710 に答える
0

DLL の指定が間違っていました。PDU_PIN_DATA *pDLCPinDataは、構造体へのポインターではなく、構造体の配列へのポインターでした。それが、テクノメイジの提案が機能する理由です。それは私の側の問題です。今後ともテクノメージをよろしくお願いいたします。

構造体配列に値を割り当てる方法は次のとおりです。正常に動作します。質問の 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;
于 2012-10-08T22:16:42.743 に答える