4

次の Delphi 関数があります。

function DoX(const InputBuffer: Pointer; const InputBufferSize: longword; OutputBuffer: Pointer; var OutputBufferSize: longword): longbool;

OutputBuffer と OutputBufferSize は結果の一部として関数に設定され、メソッドが成功したかどうかを示すブール値が返されます (InputBuffer と OutputBuffer はバイト配列になります)。

必要な関数のいくつかを dll から JNA にマップすることができましたが、正常に動作していますが、これは問題を引き起こしています。

4

1 に答える 1

5

ほとんどのJNAドキュメントは、DelphiではなくCを使用していることを前提としているため、その関数と同等のCから始めます。

int DoX(const void* InputBuffer,
        unsigned int InputBufferSize,
        void* OutputBuffer,
        unsigned int* OutputBufferSize);

また、呼び出し規約を正しく理解する必要があります。Delphiのデフォルトはregisterですが、これはおそらくあなたが望むものではありません。代わりにstdcallを使用してください。これは、他のすべてのDLLが使用するものです。

Javaには、使用したものと同等の符号なし型がないため、符号なしを無視することから始めます。それはInputBufferSizeになりますint。関数はブール結果を返すのでboolean、その戻り型に使用します。JNAは、ByReferenceクラスの子孫を介した参照による型の受け渡しをサポートしているため、を使用IntByReferenceOutputBufferSizeます。

最後にポインタがあります。あなたはそれらがバイト配列だと言ったので、なぜあなたがDelphiコードでそれらをそのように宣言しないのか私は困惑しています。を使用するか、新しいタイプをPByte宣言してそれを使用します。PByteArray(この変更により、その関数の実装がはるかに便利になります。)Javaで、それらをバイト配列として宣言してみてください。したがって、最終製品:

boolean DoX(byte[] InputBuffer,
            int IntputBufferSize,
            byte[] OutputBuffer,
            IntByReference OutputBufferSize);
于 2009-03-25T14:47:51.190 に答える