Java Delphi Dll 函数中的 JNA 映射
Java JNA Mapping in Delphi Dll function
如何将此函数映射到 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 = ;
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值可以是0代表错误,1代表正确执行;
我的建议是:
JNA Java函数代码:
int send_command(byte command, byte size, byte[] data);
问题是dll的函数returns0。我也试过其他的Datatypes,但是没用jet。我认为问题是dll函数无法写入参数数据。
看起来你的 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,则需要通过引用传递 size
和 data
参数,即使它们看起来具有值语义。这个答案涵盖了 JNA 中的引用传递:How do I get a java JNA call to a DLL to get data returned in parameters?
如何将此函数映射到 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 = ;
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值可以是0代表错误,1代表正确执行;
我的建议是:
JNA Java函数代码:
int send_command(byte command, byte size, byte[] data);
问题是dll的函数returns0。我也试过其他的Datatypes,但是没用jet。我认为问题是dll函数无法写入参数数据。
看起来你的 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,则需要通过引用传递 size
和 data
参数,即使它们看起来具有值语义。这个答案涵盖了 JNA 中的引用传递:How do I get a java JNA call to a DLL to get data returned in parameters?