Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JNA和Delphi DLL获取PointerByReference中的值时出错_Java_Delphi_Dll_Jna - Fatal编程技术网

Java 使用JNA和Delphi DLL获取PointerByReference中的值时出错

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);

我需要用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);
    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。