我如何使用JNA映射此Delphi函数

时间:2009-03-25 12:24:29

标签: java delphi jna

我有以下Delphi功能:

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

OutputBuffer和OutputBufferSize将作为结果的一部分在函数中设置,并使用布尔返回来指示方法是否成功(InputBuffer& OutputBuffer将是字节数组)。

我已经设法使用JNA从dll映射我所需的一些功能,但它们工作正常,但是这个问题给了我一些问题,我们将不胜感激。

1 个答案:

答案 0 :(得分:5)

大多数JNA文档都假设你使用的是C语言,而不是Delphi,所以从等效于该函数的C开始:

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

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

Java没有与您使用的无符号类型等价的类型,因此首先忽略unsignedness。这使得InputBufferSize成为int。您的函数返回布尔结果,因此请使用boolean作为返回类型。 JNA支持通过ByReference类的后代按引用传递类型,因此对OutputBufferSize使用IntByReference

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

boolean DoX(byte[] InputBuffer,
            int IntputBufferSize,
            byte[] OutputBuffer,
            IntByReference OutputBufferSize);