2015-07-10 180 views
0

我想使用JNA 4.1.0调用第三方C库(DLL)函数。如何提取参考(通过JNA)返回的值?

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

回答

1

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

+0

就是这样。谢谢。我是否需要担心通过调用'getPointer()'获得的现在未引用的指针,即当'PointerByReference'被GCed时它会被释放吗? –

+0

当'PointerByReference'对象获取GC'd时,JNA将取消分配存储空间。 'getPointer()'不分配任何东西;当创建PointerByReference对象时分配内存。 – technomage