返回并访问jna中结构对象的数组

我有一个结构,在C中包含一些char指针:

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)); } } 

它将垃圾值作为输出,我必须更新我的代码以获得正确的输出..

来自javadoc :

返回一个struct数组

将方法声明为返回适当类型的Structure,然后调用Structure.toArray(int)以转换为适当大小的初始化结构数组。 请注意,您的Structure类必须具有no-args构造函数,并且您负责以适用于被调用函数的任何方式释放返回的内存(如果适用)。

 // 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