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