如何提取引用返回的值(通过 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 函数接受一个输出参数 infoinfo 由 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() 为您提供传递给本机函数的地址。