java - 使用 JNA 和 Delphi DLL 在 PointerByReference 中获取值时出错

标签 java delphi dll jna

我需要使用 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 变量中的值。

如何获取数据中的值?

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;

最佳答案

使用 Memory 来完成此操作类(class)。

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,因此上面的内容很可能存在语法错误。但我相信基本方法是正确的。

关于java - 使用 JNA 和 Delphi DLL 在 PointerByReference 中获取值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31545024/

相关文章:

java - hibernate返回列表转换问题

java - 是否有像 Map<K,V,W, ...> 这样的数据结构?

java - 管理线程同步中的静态关键字 - Java

delphi - 在什么条件下,TForm 会在显示时触发 OnResize?

delphi - 可以解析Delphi XMLDoc格式并建立在线帮助的工具

delphi - KOL应用程序的主图标

java - 由于字符串太大而无法获取有效负载(base64 图像)

c - 有没有一种方法可以根据 printf/更简单的函数(轻松地)定义 fprintf?

c++ - 使用 mingw32 构建时与 cygwin1.dll 链接?

c++ - 如何在 Visual Studio 2010 c++ 项目中使用 System.Net 命名空间?