2013-10-18 170 views
0

我有下面的C++結構和功能:結構與結構的數組JNA

typedef struct _Phase_Information 
{ 
    char infoMessage[MAX]; 
} INFORMATION; 

typedef struct _Informations 
{ 
    int infoCount; 
    INFORMATION *infoArray; 
} INFORMATIONS ; 

int GetInformations(INFORMATIONS *pInfos); 

我使用它們像這樣:

INFORMATIONS informations; 
INFORMATION * informationArray = new INFORMATION[MAX_INFOS]; 
informations.info = informationArray; 
int error = GetInformations(&informations); 

現在我想用我的C++庫在Java中使用JNA ...所以我做了以下內容:

​​

我試着這樣調用庫:

Informations.ByReference informations = new Informations.ByReference(); 
informations.infoArray= new Information.ByReference(); 
int error = CLib.GetInformations(Informations); 

Information[] test =(Information[])informations.infoArray.toArray(Informations.infoCount); 

有些時候我只能檢索數組的第一個元素,但剩下的時間我的Java崩潰......所以我相信這是與在java網站上沒有分配內存有關,但我無法進一步:/

回答

2

原生char對應於Java byte

請注意,您的示例將大小爲1的數組傳遞給GetInformations

除了不正確的映射,這可能是你的崩潰的原因,你的映射看起來不錯。

編輯

你應該初始化infoCount給你傳遞的陣列(在您的示例「1」)的大小。如果你想通過一個更大的陣列,你需要撥打.toArray()informations.infoArray之前致電GetInformations()。當您撥打Structure.toArray()時會分配額外陣列元素的內存;直到那時你只有內存分配給單個元素。

+0

調用toArray()可以解決Java崩潰問題,但在調用函數之前我不知道數組的大小,但我認爲這是我們現在必須討論的。謝謝! :) – seveves