我有以下Delphi功能:
function DoX(const InputBuffer: Pointer; const InputBufferSize: longword; OutputBuffer: Pointer; var OutputBufferSize: longword): longbool;
OutputBuffer和OutputBufferSize将作为结果的一部分在函数中设置,并使用布尔返回来指示方法是否成功(InputBuffer& OutputBuffer将是字节数组)。
我已经设法使用JNA从dll映射我所需的一些功能,但它们工作正常,但是这个问题给了我一些问题,我们将不胜感激。
答案 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);