4

我有以下德尔福功能:

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 文档都假定您使用的是 C,而不是 Delphi,因此请从与该函数等效的 C 开始:

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

您还希望获得正确的调用约定。Delphi 的默认值是register,这可能不是你想要的。改用stdcall;这就是所有其他 DLL 使用的。

Java 没有与您使用的类型等效的无符号类型,因此首先忽略无符号。这InputBufferSize使得int. 您的函数返回一个布尔结果,因此请使用boolean它的返回类型。JNA 支持通过类的后代通过引用传递类型ByReference,因此请使用IntByReferencefor OutputBufferSize

最后是指针。您说它们是字节数组,所以我很困惑为什么您不在 Delphi 代码中以这种方式声明它们。要么使用PByte,要么声明一个新PByteArray类型并使用它。(该更改将使实现该功能更加方便。)在 Java 中,尝试将它们声明为字节数组。所以,最终产品:

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