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函数需要一个不折不扣的说法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映射有什么问题吗?我可以更好地调试,看看里面发生了什么?
就是这样。谢谢。我是否需要担心通过调用'getPointer()'获得的现在未引用的指针,即当'PointerByReference'被GCed时它会被释放吗? –
当'PointerByReference'对象获取GC'd时,JNA将取消分配存储空间。 'getPointer()'不分配任何东西;当创建PointerByReference对象时分配内存。 – technomage