我有以下Delphi函数:
function DoX(const InputBuffer: Pointer; const InputBufferSize: longword; OutputBuffer: Pointer; var OutputBufferSize: longword): longbool;
OutputBuffer和OutputBufferSize将作为结果的一部分在函数中设置,并使用布尔返回来指示方法是否成功(InputBuffer和OutputBuffer将是字节数组).
我已经设法从dll映射我的一些所需功能与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
类,所以使用IntByReference
对OutputBufferSize
.
最后是指针.你说它们是字节数组,所以我很困惑你为什么不在你的Delphi代码中声明它们.使用PByte
或声明新PByteArray
类型并使用它.(这种改变将使实现该功能更加方便.)在Java中,尝试将它们声明为字节数组.那么,最终产品:
boolean DoX(byte[] InputBuffer, int IntputBufferSize, byte[] OutputBuffer, IntByReference OutputBufferSize);