Delphi Dll函数中的Java JNA映射
如何使用JNA映射此function:
Delphi Dllfunction代码:
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 Javafunction代码:
int send_command(byte command, byte size, byte[] data);
问题是dll的函数返回0.我也尝试过其他数据类型,但它没有使用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
,是一个指向单个字节的指针,还是一个指向数组的指针? 如果是后者,arrays有多大。 等等。 您需要指定所有这些信息以定义接口。
如果你真的无法更改DLL,那么你需要通过引用传递size
和data
参数,即使它们看起来有值语义。 这个答案涵盖了JNA中的引用传递: 如何获取对DLL的Java JNA调用以获取参数中返回的数据?