2013-03-15 75 views
2

我有一個包含用C一些字符指針的結構:返回和訪問結構的對象的陣列中的JNA

struct inputsheet 
{ 
    char* TestCaseID[MAX_TEST_CASES]; 
    char* Description[MAX_TEST_CASES]; 
}; 

我有一個功能,是結構的對象的返回數組:

struct inputsheet* getapi(char *docname); 

現在我想在Java中使用它。我怎樣才能處理這個結構對象的數組?我能夠處理單個對象,但不能處理數組。

對於單個對象我的C代碼是在這裏:

public class str3 extends com.sun.jna.Structure implements com.sun.jna.Structure.ByReference { 
    public Pointer a1; 
    public Pointer b2; 
    public Pointer c3[]=new Pointer[10]; 
} 

訪問它:

str2 s2=CLibrary.INSTANCE.parseid(xmlFile1); 
for(Pointer p1:s2.testCaseID) { 
    if(p1!=null) 
    { 
     System.out.println(p1.getString(0)); 
    } 
} 

編輯

\\c code 
struct str3{ 
char *a; 
char *b; 
char *ab[10]; 
} 

\\jna implementation 


package parser; 
import com.sun.jna.Pointer; 
public class str3 extends com.sun.jna.Structure implements  com.sun.jna.Structure.ByReference{ 
public Pointer a1; 
public Pointer b2; 
public Pointer c3[]=new Pointer[10]; 
} 


\\calling it 
import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
class ab{ 
    interface CLibrary extends Library{ 
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("chardll", 
    CLibrary.class); 
    str3 getStruct(); 
    } 

public static void main(String[] args) { 
    int size = 5; 
    str3 a=CLibrary.INSTANCE.getStruct(); 
    str3[] ab=(str3[])a.toArray(size); 
    System.out.println(ab[0].a1.getString(0));   
    } 
} 

這是給垃圾值作爲輸出,,我必須更新我的代碼才能獲得正確的輸出結果。

回答

1

javadoc

返回結構

數組聲明方法返回適當類型的結構,然後調用Structure.toArray(int)轉換到的 初始化結構的數組適當的尺寸。請注意,您的 Structure類必須具有無參數構造函數,並且您負責釋放返回的內存,只要適用於任何 方式適用於被調用的函數。

// Original C code 
struct Display* get_displays(int* pcount); 
void free_displays(struct Display* displays); 

// Equivalent JNA mapping 
Display get_displays(IntByReference pcount); 
void free_displays(Display[] displays); 
... 
IntByReference pcount = new IntByReference(); 
Display d = lib.get_displays(pcount); 
Display[] displays = (Display[])d.toArray(pcount.getValue()); 
... 
lib.free_displays(displays); 

編輯

名義上,你的結構應該是這樣的(基於您的本地定義):

class inputsheet extends Structure { 
    public Pointer[] TestCaseID = new Pointer[MAX_TEST_CASES]; 
    public Pointer[] Description = new Pointer[MAX_TEST_CASES]; 
} 

public inputsheet getapi(String docname); 

int size = ...; // whatever you do to figure out the size of your returned array 
inputsheet sheet = INSTANCE.getapi("some-doc"); 
inputsheet[] sheets = (inputsheet[])sheet.toArray(size); 

如果來電者不需要寫inputsheet字段,則應使用String而不是Pointer

+0

使用後,我仍然無法得到所需的結果要麼給我垃圾的價值(萬一我使用BYREFERENCE),否則它給予NULL指針異常(在ByValue的情況下) – Nitesh 2013-03-17 16:28:19

+0

字符串可用於我的指針是const,但它不在我的情況下 – Nitesh 2013-03-17 16:29:17

+0

由於你的本地函數返回struct *而不是'struct',所以使用'Structure.ByValue'是不正確的。你需要更清楚地表明你嘗試過的東西;你的問題引用'inputsheet','str3'和'str2',它們之間沒有明顯的關係。 – technomage 2013-03-17 19:37:06