java - 我如何将这个 Delphi 函数映射到 JNA

标签 java delphi jna

我有以下 Delphi 函数:

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

OutputBuffer 和 OutputBufferSize 将在函数中设置为结果的一部分,并返回一个 boolean 值以指示该方法是否成功(InputBuffer 和 OutputBuffer 将是字节数组)。

我已经设法将我需要的一些函数从 dll 映射到 JNA,它们工作正常,但是这个给我带来了问题,我们将不胜感激。

最佳答案

大多数 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 结果,因此使用 boolean 作为其返回类型。 JNA 支持通过 ByReference 的后代按引用传递类型类,所以使用 IntByReference对于 OutputBufferSize

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

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

关于java - 我如何将这个 Delphi 函数映射到 JNA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/681341/

相关文章:

java - 从命令行加载 spring 上下文的属性

java - 如何使用 tomcat 5.5 上传 excel 文件?

java - 确定文件是否为联结(在 Windows 中)?

java - 访问已创建 View 的同一实例

java.lang.ClassCastException : java. lang.String 无法转换为 org.apache.avro.generic.GenericRecord

delphi - GeoJSON 开源库

delphi - 为什么Delphi XE2找不到QuickReports包的QrCtrls.dcu文件?

delphi - Delphi 6与RAD Studio 2009并存

java - 从任务栏最大化 java 进程

java - JNA:java.lang.Error:无效的内存访问 - TS3 库