当前位置:  开发笔记 > 编程语言 > 正文

我如何使用JNA映射此Delphi函数

如何解决《我如何使用JNA映射此Delphi函数》经验,为你挑选了1个好方法。

我有以下Delphi函数:

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

OutputBuffer和OutputBufferSize将作为结果的一部分在函数中设置,并使用布尔返回来指示方法是否成功(InputBuffer和OutputBuffer将是字节数组).

我已经设法从dll映射我的一些所需功能与JNA,他们工作正常,但这一个给我的问题,任何帮助将不胜感激.



1> Rob Kennedy..:

大多数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类,所以使用IntByReferenceOutputBufferSize.

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

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有