2015-07-10 183 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