2017-04-16 13 views
1

私はJNA APIを使用しようとしている 私のDLL関数は次のとおりです。ロードDLL - JNA

Int OpenComPort(int Port, unsigned char *ComAdr, unsigned char Baud, int* FrmHandle); 

私のJavaインタフェースの定義は次のとおりです。

public int OpenComPort(int p, Pointer ComAdr, Pointer Baud, Pointer FrmHandle); 

私はタイプのどのような種類があります私のインターフェイスで使用するには? オブジェクト "ポインタ"は正しいですか?

+0

可能であれば、JNA over JNAを使用してください。 JNAはパフォーマンスキラーです。私はjavaの 'byte'は' unsigned char'にマップできると思います –

+0

あなたは正しいDLL関数の署名を投稿していますか?その関数と引数をオンラインで簡単に検索すると、あなたが含まれていない '*'シンボルが表示されます。 –

答えて

1

太字のを元の質問で強調表示すると、投稿の書式設定が投稿の重要な情報を呑み込んでしまったため、私の元の回答は正しくありません。あなたの投稿を編集して元の意図を復元しようとしましたが、私の答えを適切に更新しました。しかし、私は簡単な検索で見つけた他のDLLの関数名を見て、ソースファイルを正確に引用しているかどうか、特にBaud変数もポインタ(*)であるかどうかはわかりません。

正しいマッピングを確認するための最初の停止は、the JNA documentationである必要があります。

Cのポインタ型では、JNA Pointerが機能しますが、手動で多くの作業を行う必要があります。メモリを割り当て、結果を読み込み、ポインタアドレスから読み込む正しいバイト数を選択する必要があります。ポインタの型が指定されている場合は、この場合のように、メモリ割り当ての作業を行う適切なByReferenceマッピングを使用し、メソッドへの「強く型付けされた」アクセスを制御する必要があります。

unsigned char *ComAdrの場合、ByteByReferenceマッピングを使用します。同様にint * FrmHandleの場合は、IntByReferenceを使用します。 Baudを単にunsigned charタイプと指定しています。これは直接byteにマップされます。しかし、他のAPIの場合はchar *と同じですので、同じByteByReferenceマッピングになります。

Javaは符号なし変数を使用しないので、符号なしC値に対応することを確認するために、戻り値からそれらを抽出すると、負のバイト値に対して追加の処理を行う必要があります。例えば、& 0xff