我试图使用JNA 4.1.0调用第三方C库(DLL)函数。
C函数声明是:
int hasp_get_sessioninfo(
long handle,
const char *format,
char **info);
我的JNA直接映射方法如下所示:
public static native int hasp_get_sessioninfo(
NativeLong sessionHandle,
String query,
PointerByReference info);
C函数采用out-argument info
。 info
由C函数分配,然后填充以NULL结尾的字符串。
在Java部分中,在我调用Java方法之后,我尝试从String
中读取PointerByReference info
,如下所示:
public String getInfo(final String format) throws SentinelException {
PointerByReference buffer = new PointerByReference();
int status = SentinelLibrary.hasp_get_sessioninfo(handle.getValue(), format, buffer);
if (status != 0) {
throw new SentinelException();
}
String info = buffer.getPointer().getString(0);
SentinelLibrary.hasp_free(buffer.getPointer());
return info;
}
问题是我总是得到一些8到12个字节的随机值。这让我相信buffer
根本没有被C函数触及。
我的JNA映射有问题吗?我可以更好地调试它,看看里面发生了什么吗?
答案 0 :(得分:1)
PointerByReference.getValue()
将为您提供"返回"值。 PointerByReference.getPointer()
为您提供传递给本机函数的地址。