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

我有以下Delphi函数:

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

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

我已经设法从dll映射我的一些所需的function与JNA,他们工作正常,但这一个给我的问题,任何帮助将不胜感激。

大多数JNA文档假设您使用的是C,而不是Delphi,因此从等效于该函数的C开始:

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

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

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

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

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