我该如何使用JNA映射这个Delphi函数

4

我有下面这个Delphi函数:

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

函数中的OutputBuffer和OutputBufferSize将作为结果的一部分进行设置,其中还有一个布尔返回值来指示方法是否成功(InputBuffer和OutputBuffer将是字节数组)。我已经成功地使用JNA从dll中映射了一些必需的函数,并且它们运行良好,但是这个函数给我带来了问题,任何帮助都将不胜感激。
1个回答

5

大多数JNA文档假定您使用的是C语言,而不是Delphi语言,因此请从该函数的C语言等效版本开始:

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

你还需要正确选择调用约定。Delphi的默认值是“register”,这可能不是你想要的。改用“stdcall”;其他所有DLL都使用它。
Java没有无符号类型的等效物,所以首先忽略无符号性。这使得InputBufferSize成为一个int。你的函数返回一个布尔结果,因此将其返回类型设置为boolean。JNA支持通过ByReference类的后代通过引用传递类型,因此对于OutputBufferSize,请使用IntByReference
最后是指针。你说它们是字节数组,所以我很困惑为什么你在Delphi代码中没有这样声明它们。要么使用PByte,要么声明一个新的PByteArray类型并使用它。(这个更改将使实现该函数更加方便。)在Java中,尝试将它们声明为字节数组。因此,最终产品:
boolean DoX(byte[] InputBuffer,
            int IntputBufferSize,
            byte[] OutputBuffer,
            IntByReference OutputBufferSize);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接