Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jna中结构对象数组的返回和访问_Java_C_Jna - Fatal编程技术网

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

Java jna中结构对象数组的返回和访问,java,c,jna,Java,C,Jna,我有一个包含C中一些字符指针的结构: struct inputsheet { char* TestCaseID[MAX_TEST_CASES]; char* Description[MAX_TEST_CASES]; }; 我有一个返回结构对象数组的函数: struct inputsheet* getapi(char *docname); 现在我想在Java中使用它。我如何处理这个结构对象数组?我可以处理单个对象,但不能处理数组 对于单个对象,我的C代码如下: public

我有一个包含C中一些字符指针的结构:

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));          
    }
}
它将垃圾值作为输出,其中我必须更新代码以获得正确的输出。

来自:

返回结构数组

将该方法声明为返回适当类型的结构,然后调用
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);
编辑

\\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));          
    }
}
名义上,您的结构如下所示(基于您的本地定义):


如果调用方不需要写入
inputsheet
字段,您应该使用
String
而不是
Pointer

使用此选项后,我仍然无法获得所需的结果,或者它给了我垃圾值(如果我使用BYREFERENCE),或者它给了空指针异常(如果是ByValue)当我的指针为常量时,可以使用字符串,但在我的情况下不是这样。使用
Structure.ByValue
是不正确的,因为本机函数返回的是
struct*
,而不是
struct
。你需要更明确地说明你所做的尝试;您的问题引用了
inputsheet
str3
、和
str2
,它们之间没有明显的关系。实际上,我的主要项目中使用了inputsheet,我只是想先实现一个伪表,因为str3是我的结构,您的本机代码如何返回“结构数组”?根据您的规范,返回的指针必须是大小为
N*sizeof(str3)
的堆分配块,其中
N
是结构数。