我有一个包含 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));
}
}
EDIT
\\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:
返回结构体数组
将该方法声明为返回适当类型的结构,然后调用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);
EDIT
名义上,您的结构将如下所示(基于您的本机定义):
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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)