【问题标题】:Error getting value in PointerByReference with JNA and Delphi DLL使用 JNA 和 Delphi DLL 在 PointerByReference 中获取值时出错
【发布时间】:2015-07-21 16:49:05
【问题描述】:

我需要用 Delphi DLL 开发一个 Java 程序,但是有一个问题是:

我在JNA中映射如下:

- Delphi 函数:

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

- Java 函数:

public int send_command(byte command, ByteByReference size, PointerByReference data);

函数返回 1(成功结果),但我无法获取 data 变量中的值。

如何获取 data 中的值?

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;

【问题讨论】:

  • “无法获取数据变量中的值”是什么意思?
  • 这个DLL与设备对话,这个函数返回一个字节数组,在Delphi中返回作为测试软件的例子。
  • 我仍然建议修复 delphi 代码
  • @DavidHeffernan,改变变量? byte 到 BYTE 和 pbyte 到 PBYTE ?
  • 什么代码不能正常工作?填充data 的Delphi 代码,还是尝试从data 读取的Java 代码?你需要更具体。

标签: java delphi dll jna


【解决方案1】:

使用Memory 类来实现。

Memory memory = new Memory(40);
PointerByReference data = new PointerByReference();
data.setValue(memory);
// call the function now
byte[] bytes = new byte[40];
memory.read(0, bytes, 0, 40);

请记住,我根本不懂 Java,所以上面很可能存在语法错误。但我相信基本方法是合理的。

【讨论】:

  • 我使用了这个例子,但JVM在执行的最后阶段停止工作。
  • 我建议你尝试一些调试。你了解代码的作用吗?
  • 好的。我会尝试调试。是的......像在 Delphi Teste 程序中一样在内存中分配(40 个位置)。即使这样,也有必要更改 DLL(删除 var)?
  • 所以我首先制作一个具有相同原型的函数的 Delphi DLL。然后安排该函数简单地将其输入写入控制台。从 Java 控制台应用程序调用它。在尝试使用真正的 DLL 之前,先证明互操作可以正常工作。
  • 效果很好。感谢 David Heffernan 和 technomage。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多