【问题标题】:Function mapping Delphi DLL with Java (JNA)函数映射 Delphi DLL 与 Java (JNA)
【发布时间】:2015-06-19 19:24:04
【问题描述】:

我在尝试将 Delphi 中的 DLL 的两个函数与 JNA Java 一起使用时遇到问题。在测试软件(Delphi,由 DLL 提供)中,我有这个功能(在测试软件中完美运行):

function abrir_conexao (const modelo : **byte**; const host : **pansichar**; const porta : **word**; const senha : **pansichar**) : integer; stdcall external 'comunicacao.dll';

function enviar_comando (const comando : **byte**; var tamanho : **byte**; var dados : **pbyte**) : integer; stdcall external 'comunicacao.dll';

我正在尝试在 Java (JNA) 中实现这些功能。我通常会加载 dll,但是,我认为问题在于使用正确的原始变量:

public int abrir_conexao (**byte** modelo, **String** host, **short** porta, **String** senha);

public int enviar_comando(**byte** comando, **byte** tamanho, **byte[]** dados);

但它不起作用。有人可以帮忙吗?

【问题讨论】:

  • “它不工作”是永远不够的。请描述这是如何失败的。
  • JNA 用于 Java 代码调用本机代码。 JNI 用于将本机代码调用到 Java 代码中。你到底想完成什么?
  • @Remy No. JNI 和 JNA 都用于从 Java 调用本机代码。 JNI 也支持将本机代码回调到 Java 中。
  • 您的编辑仍然只提供“它不起作用”。请阅读网站帮助区。

标签: java delphi dll jna


【解决方案1】:

对于以下原生函数:

function abrir_conexao (const modelo : byte; const host : pansichar; const porta : word; const senha : pansichar) : integer; stdcall external 'comunicacao.dll';

function enviar_comando (const comando : byte; var tamanho : byte; var dados : pbyte) : integer; stdcall external 'comunicacao.dll';

JNA 映射:

public interface MyLibrary extends StdCallLibrary {
    MyLibrary INSTANCE = (MyLibrary)Native.loadLibrary('comunicacao', MyLibrary.class);
    int abrir_conexo(byte modelo, String host, short port, String senha);
    int enviar_comando(byte comando, byte tamanho, byte[] dados);
}

【讨论】:

  • technomage ...我在使用 pbyte (Delphi) 和 byte[] (Java) 时遇到问题 ... 不工作 ... 命令“enviar_comando”总是返回 0(失败),其中 1(是成功)。你有什么想法吗?
  • 您确定您的byte[] 足够大吗?通常你会有一个额外的参数来指示你传递的缓冲区有多大。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
相关资源
最近更新 更多