簡體   English   中英

如何將結構數組傳遞給函數以在JNA中獲得結果

[英]How to pass array of structures to function in order to get results in JNA

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM