从java调用delphi编写的dll

kx1ctssn  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(854)

我有一个用delphi10.4编写的简单dll。当我从另一个delphi应用程序调用dll时,一切都能100%工作,但是当我从java应用程序(使用jna)调用同一个dll时,我得到了奇怪的结果。
我最初声明了pchar类型的dll输入参数。当我从java应用程序调用dll时,我的dll中会出现有趣的字符。我把它改成了shortstring,但是我在dll中丢失了字符串的第一个字符。我可能需要用java做一些数据类型转换,但是我找不到什么。有人能帮忙吗?
以下是delphi中的示例dll,以演示:

procedure TestDataTypes(PCharVar: PChar; ShortStringVar: ShortString); stdcall;
begin
  ShowMessage('PChar: ' + PCharVar + #13#10 +
              'ShortString: ' + ShortStringVar);
end;

exports
  TestDataTypes;

从delphi调用dll的代码:

procedure TestDataTypes(PCharVar: PChar; ShortStringVar: ShortString); stdcall; external 'TestDataType.dll';
...
TestDataTypes(PChar('PChar Value'), 'ShortString Value');

从java调用dll的代码:

INSTANCE.TestDataTypes("Java PChar Value", "Java ShortString Value");

结果:从delphi调用dll时为顶部,从java调用时为底部:

uoifb46i

uoifb46i1#

ShortString 是一个旧的delphi类型,它保存一个ansi字符串并将长度存储在第一个字节中。你不应该用它。 PChar ,在delphi的最新版本中,是的别名 PWideChar .
您正在使用jna从java调用本机代码。
java 语 String 内部使用utf-16。
jna使用以下规则:
String 已转换为 PAnsiCharWString 已转换为 PWideChar 因此,如果要将unicode字符串传递给dll,则应如下声明java方法:

public void TestString(WString text);

在德尔福:

procedure TestString(Text: PChar); stdcall;
begin
    ShowMessage(Text);
end;

并调用如下函数:

INSTANCE.TestString(new WString("A Unicode string"));
quhf5bfb

quhf5bfb2#

PChar 只是一个别名,已更改为 PWideChar 在Delphi2009中(比方说,标准字符串和字符类型更改为 Unicode )! 所以现在每个字符使用2个字节。
所以为了让你的dll正常工作,你应该改变 PCharPAnsiChar .
或者您必须对java应用程序进行一些更改,以便它使用一些双字节字符类型。但是我没有java的经验,所以我帮不了你。
忘了shortstring吧,这种类型与其他语言不兼容!
有关如何使用和不使用DLL的更多参考信息,请参阅本网站。

相关问题