我有一个用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调用时为底部:
2条答案
按热度按时间uoifb46i1#
ShortString
是一个旧的delphi类型,它保存一个ansi字符串并将长度存储在第一个字节中。你不应该用它。PChar
,在delphi的最新版本中,是的别名PWideChar
.您正在使用jna从java调用本机代码。
java 语
String
内部使用utf-16。jna使用以下规则:
一
String
已转换为PAnsiChar
一WString
已转换为PWideChar
因此,如果要将unicode字符串传递给dll,则应如下声明java方法:在德尔福:
并调用如下函数:
quhf5bfb2#
PChar
只是一个别名,已更改为PWideChar
在Delphi2009中(比方说,标准字符串和字符类型更改为Unicode
)! 所以现在每个字符使用2个字节。所以为了让你的dll正常工作,你应该改变
PChar
至PAnsiChar
.或者您必须对java应用程序进行一些更改,以便它使用一些双字节字符类型。但是我没有java的经验,所以我帮不了你。
忘了shortstring吧,这种类型与其他语言不兼容!
有关如何使用和不使用DLL的更多参考信息,请参阅本网站。