如何提取引用返回的值(通过JNA)?

时间:2015-07-10 12:44:30

标签: java jna

我试图使用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 infoinfo由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映射有问题吗?我可以更好地调试它,看看里面发生了什么吗?

1 个答案:

答案 0 :(得分:1)

PointerByReference.getValue()将为您提供"返回"值。 PointerByReference.getPointer()为您提供传递给本机函数的地址。