Delphi Dll函数中的Java JNA映射

时间:2015-07-17 17:59:52

标签: java delphi dll mapping jna

如何使用JNA映射此功能:

Delphi Dll功能代码:

function send_command (const command : byte; var size : byte; var data : pbyte) : integer; stdcall external 'comunication.dll';

使用Delphi示例程序中的示例:

send_command(cmdCLOCK_ADJUST,tam,pb);

其中:

const 
    cmdCLOCK_ADJUST = $18;

var
   tam : byte;
   pb, p : pbyte;

begin
   ...
    tam = 7;
    p:= pb;
       for i:= 1 to tam do
          begin
            p^:= Dados [i];
            inc (p)
          end;
    send_command (cmdCLOCK_ADJUST, tam, pb);
    freemem (pb);
   ...
end

返回的int值对于Error可以是0,对于正确执行可以是1;

我的建议是:

JNA Java功能代码:

int send_command(byte command, byte size, byte[] data);

问题是dll的函数返回0.我也尝试过其他数据类型,但它没有使用jet。我认为问题是dll函数无法写入参数数据。

1 个答案:

答案 0 :(得分:1)

看起来您的Delphi代码实际上是错误的。

size参数似乎是一种将数据长度从调用者传递给被调用者的方法。因此,它不应该是var参数。

data参数似乎是指向调用者分配的缓冲区的指针。同样,这不应该是var参数。只是一个普通的PByte,按值传递。

这将使Delphi代码如下:

function send_command(const command: Byte; size: Byte; data: PByte): Integer; 
  stdcall external 'comunication.dll';

然后Delphi代码将匹配您的Java代码。

当然,我必须做出一些猜测才能写出这个答案。根据我对这些问题的经验猜测,但猜测都是一样的。您应该从中获得的真正教训是,接口不是由其参数类型指定的。您还需要指定参数传递的语义。

那么,当你有PByte参数时,是指向单个字节的指针,还是指向数组的指针?如果是后者,阵列有多大。等等。您需要指定所有这些信息来定义接口。

如果您确实无法更改DLL,那么您需要通过引用传递sizedata参数,即使它们看起来具有值语义。这个答案涵盖了JNA中的参考文献:How do I get a java JNA call to a DLL to get data returned in parameters?