我有一个提供头文件的 c++ dll 库,但没有实现。我为这个库函数实现了 JNA 调用。而且我只有一个功能(其他,甚至类似的工作正常)的问题。这是来自 .h 文件的声明:
int CALLINGCONV SMIMESignML(
const char* pin,
unsigned long slot,
const char* szOutputFilePath,
const char* szFrom,
const char* szTo,
const char* szSubject,
const char* szOtherHeaders,
const char* szBody,
const char* szAttachments,
unsigned long dwFlags,
int bInitialize
);
Java代码:
public interface Dll extends StdCallLibrary {
public String JNA_LIBRARY_NAME = "libname.dll";
int SMIMESignML(String pPin, int slot, String pOut, String pFrom, String pTo,
String pSubject, String pHeaders, String pBody, String pAttachments, int flags,
int init);
}
public class Test {
private static final Dll dll = (Dll) Native.loadLibrary(Dll.JNA_LIBRARY_NAME, Dll.class, W32APIOptions.ASCII_OPTIONS);
public static void main(String[] args) {
String pOut = "";
String pFrom = "";
String pTo = "";
String pBody = "";
String pAttachments = "";
int code = dll.SMIMESignML(null, 0, pOut, pFrom, pTo, null, null, pBody, pAttachments, 0, 0);
System.out.println(code);
}
}
该函数应返回不同的 int 错误代码,但它始终返回代码 0xFFFF。
我可以用 Pascal 中的相同代码检查它:
unit dll;
interface
const
JNA_LIBRARY_NAME = 'libname.dll';
function SMIMESignML(pPin: PChar; slot: integer; pOut: PChar; pFrom: PChar; pTo: PChar;
pSubject: PChar; pHeaders: PChar; pBody: PChar; pAttachments: PChar; flags: integer;
init: integer): integer; stdcall; external JNA_LIBRARY_NAME;
implementation
end.
program Hello;
uses dll;
var
code: integer;
begin
code := SMIMESignML(nil, 0, '', '', '', nil, nil, '' , '', 0, 0);
writeln(code);
end.
Pascal 代码返回 2,Java 代码返回 65535。此外,Pascal std 调用工作正常,更改参数我们得到不同的错误代码(0=OK 和其他),但具有相同参数的 Java 不起作用,它总是返回 0xFFFF。如何调试它以了解问题?
PS 此外,在同一个库中,我有这个功能,它可以在 JNA 上正常工作,没有任何问题:
int CALLINGCONV PKCS7SignML(
const char *pin,
unsigned long slot,
const char* szInputFileName,
const char* szOutputFileName,
int bInitialize);
操作系统是 Win8 x64,JavaOracle7x86,库是 x32。“无符号长”不应该是问题,因为它在 Windows 上应该是 4 个字节。
如果在这两个示例中相同的 STD 调用返回不同的结果,我做错了什么?我该如何调试它?