如何提取引用返回的值(通过 JNA)?
How do I extract a value returned by reference (via JNA)?
我正在尝试使用 JNA 4.1.0 调用第 3 方 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 函数接受一个输出参数 info
。 info
由 C 函数分配,然后填充以 NULL 结尾的字符串。
在 Java 部分,在调用 Java 方法后,我尝试从 PointerByReference info
中读取 String
,如下所示:
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;
}
问题是我总是得到一些八到十二个字节左右的随机值。这让我相信 buffer
根本没有被 C 函数触及。
我的JNA映射有问题吗?我可以更好地调试它,看看里面发生了什么吗?
PointerByReference.getValue()
将为您提供 "returned" 值。 PointerByReference.getPointer()
为您提供传递给本机函数的地址。
我正在尝试使用 JNA 4.1.0 调用第 3 方 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 函数接受一个输出参数 info
。 info
由 C 函数分配,然后填充以 NULL 结尾的字符串。
在 Java 部分,在调用 Java 方法后,我尝试从 PointerByReference info
中读取 String
,如下所示:
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;
}
问题是我总是得到一些八到十二个字节左右的随机值。这让我相信 buffer
根本没有被 C 函数触及。
我的JNA映射有问题吗?我可以更好地调试它,看看里面发生了什么吗?
PointerByReference.getValue()
将为您提供 "returned" 值。 PointerByReference.getPointer()
为您提供传递给本机函数的地址。