2013-03-15 49 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