Java 使用JNA和Delphi DLL获取PointerByReference中的值时出错
我需要用Delphi DLL开发Java程序,但问题是: 我在JNA中映射如下:Java 使用JNA和Delphi DLL获取PointerByReference中的值时出错,java,delphi,dll,jna,Java,Delphi,Dll,Jna,我需要用Delphi DLL开发Java程序,但问题是: 我在JNA中映射如下: const cmdREAD_STATUS = $17; procedure TForm1.ReadStatus1Click(Sender: TObject); var Data, p : pbyte; tam : byte; i, result: integer; saux : string; begin getmem (Data, 40);
const
cmdREAD_STATUS = $17;
procedure TForm1.ReadStatus1Click(Sender: TObject);
var
Data,
p : pbyte;
tam : byte;
i,
result: integer;
saux : string;
begin
getmem (Data, 40);
tam:= 0;
result:= send_comand (cmdREAD_STATUS, tam, Data);
if result= 1 then
begin
memo1.Lines.add ('Command OK');
i:= 0;
sAux:= '';
p:= Data;
while (i < Tam) do
begin
sAux:= sAux + inttohex (p^, 2)+' ';
if length (sAux) > 59 then
begin
memo1.Lines.add (SAux);
sAux:= '';
end;
inc (p);
inc (i);
end;
if sAux <> '' then
memo1.Lines.add (SAux);
end
else
memo1.Lines.add ('Result: '+inttostr(result)+' in command execution');
freemem (Data);
end;
-Delphi函数:
function send_command (const command : byte; var size : byte; var data : pbyte) : integer; stdcall external 'comunication.dll';
public int send_command(byte command, ByteByReference size, PointerByReference data);
-Java函数:
function send_command (const command : byte; var size : byte; var data : pbyte) : integer; stdcall external 'comunication.dll';
public int send_command(byte command, ByteByReference size, PointerByReference data);
函数返回1(成功结果),但我无法在数据变量中获取值
如何获取数据中的值
在Delphi测试程序中,函数调用如下:
const
cmdREAD_STATUS = $17;
procedure TForm1.ReadStatus1Click(Sender: TObject);
var
Data,
p : pbyte;
tam : byte;
i,
result: integer;
saux : string;
begin
getmem (Data, 40);
tam:= 0;
result:= send_comand (cmdREAD_STATUS, tam, Data);
if result= 1 then
begin
memo1.Lines.add ('Command OK');
i:= 0;
sAux:= '';
p:= Data;
while (i < Tam) do
begin
sAux:= sAux + inttohex (p^, 2)+' ';
if length (sAux) > 59 then
begin
memo1.Lines.add (SAux);
sAux:= '';
end;
inc (p);
inc (i);
end;
if sAux <> '' then
memo1.Lines.add (SAux);
end
else
memo1.Lines.add ('Result: '+inttostr(result)+' in command execution');
freemem (Data);
end;
const
cmdREAD_状态=$17;
程序TForm1.ReadStatus1Click(发送方:TObject);
变量
数据,
p:pbyte;
tam:字节;
我
结果:整数;
索克斯:弦;
开始
getmem(数据,40);
tam:=0;
结果:=发送命令(cmdREAD命令状态、tam、数据);
如果结果=1,则
开始
memo1.Lines.add('Command OK');
i:=0;
索克斯:='';
p:=数据;
而(我)呢
开始
sAux:=sAux+inttohex(p^,2)+'';
如果长度(sAux)>59,则
开始
备忘录1.Lines.add(SAux);
索克斯:='';
结束;
公司(p),;
公司(一);
结束;
如果是sAux那么
备忘录1.Lines.add(SAux);
结束
其他的
memo1.Lines.add('Result:'+inttostr(Result)+'in command execution');
freemem(数据);
结束;
使用类进行操作
请记住,我一点也不懂Java,因此上面可能有语法错误。但我相信基本方法是合理的 “无法获取数据变量中的值”是什么意思?此DLL与设备对话,此函数返回字节数组,在Delphi中作为测试软件的示例返回。我仍然建议修复Delphicode@DavidHeffernan,更改变量?字节对字节和字节对字节?什么代码不能正常工作?填充
数据
的Delphi代码,还是尝试从数据
读取的Java代码?您需要更具体一些。我使用了这个示例,但是JVM在执行的最后阶段停止工作。我建议您尝试一些调试。你明白代码的作用吗?好的。我将尝试调试。对像Delphi Teste程序一样在内存中分配(40个位置)。即使这样,还是有必要更改DLL(remove var)?因此我首先要用一个具有相同原型的函数创建一个Delphi DLL。然后安排函数只将其输入写入控制台。从Java控制台应用程序调用它。在尝试使用真正的DLL之前,先证明互操作是有效的。它工作得非常好。谢谢David Heffernan和technomage。