gpt4 book ai didi

java - 如何将结构数组传递给函数以便在 JNA 中获取结果

转载 作者:行者123 更新时间:2023-11-30 15:32:35 26 4
gpt4 key购买 nike

我在 C 中有以下函数:

EXPORT int GetInfo(MyObject* &myObjects);

typedef struct MyObject
{
char info1[1025];
unsigned long sizeF;
char info2[20];
};

然后我调用:

MyObject* list1;
int count = GetInfo(list1);

并迭代list1以便从每个MyObject对象获取信息(count -> list1中的元素数量)。

现在,我正在尝试在 JNA 中制作对应的内容。因此,我有:

int GetInfo(PointerByReference myObjets);

public class MyObject extends Structure {

public static class ByReference extends MyObject implements Structure.ByReference {
}
public String info1;
public NativeLong sizeF;
public String info2;

public MyObject() {
}

public MyObject(Pointer pointer) {
super(pointer);
}

@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{"info1", "sizeF", "info2"});
}
}

然后:

PointerByReference ptrRef = new PointerByReference();
int count = myLib.GetInfo(ptrRef);
if (count > 0) {
Pointer pointer = ptrRef.getValue();
MyObject myObject = new MyObject(pointer);
MyObject[] myObjects = (MyObject[]) myObject.toArray(count);
}

不幸的是,myObjects 中的所有字段都有默认值 (null/0)。我也尝试过:

int GetInfo(MyObject.ByReference myObjets);
MyObject.ByReference byRef = new PointerByReference();
int count = myLib.GetInfo(byRef);
if (count > 0) {
MyObject[] myObjects = (MyObject[]) byRef.toArray(count);
}

在本例中,仅填充了 myObjects 数组的第一个元素中的第一个字段。其余的都有默认值。

我应该怎么做才能获得填充了所有字段的 MyObjects 数组。

最佳答案

不久前我找到了解决方案。我不知道这是否明智,但它对我有用。因此,如果有人遇到类似的问题,那么您可以:

在 MyObject 类中我添加了 2 个方法:

static MyObject[] fromArrayPointer(Pointer pointer, int numberResults) {
MyObject[] arr = new MyObject[numberResults];
int offset = 0;
for (int i = 0; i < numberResults; i++) {
arr[i] = fromPointer(pointer, offset);
offset += <size of structure>;
}
return arr;
}

static MyObject fromPointer(Pointer pointer, int offset) {
MyObject inst = new MyObject();
inst.info1= pointer.getString(offset);
offset += 1025;
inst.sizeF = pointer.getNativeLong(offset);
offset += 4; // long but 4 bytes because of machine
inst.info2 = pointer.getString(offset);
offset += 20;
return inst;
}

老实说,您必须尝试这些数字和结构大小。请记住此处的数据对齐问题。

然后,你有:

if (count > 0) {
MyObject[] myObjects = MyObject.fromArrayPointer(ptrRef.getValue(), count);
}

关于java - 如何将结构数组传递给函数以便在 JNA 中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24140160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com