我如何使用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);