這是我的 C 函式的簽名:
typedef struct myitem_s {
int a;
int b;
} myitem_t;
int get_items(myitem_t** items);
在 C 程式中的用法是:
myitem_t* items = NULL;
int n = = get_items(&items);
for (int i = 0; i < n; i) {
myitem_t* item = &items[i];
}
items在get_items()函式中分配并包含一個或多個myitem_t元素。
從Java代碼我已經成功地做到了這一點:
Memory itemsPtr = new Memory(Native.POINTER_SIZE);
Pointer p = itemsPtr.getPointer(0);
int n = CLibrary.INSTANCE.get_items(p);
該n值有效,itemsPtr已更新,因此我建議值也不錯。現在我不知道如何使用它。還有另一種方法嗎?
uj5u.com熱心網友回復:
您的代碼有效,但是當 JNA 具有一些更高級別的構造時,您正在使用許多較低級別的函式。
首先, Cstruct可以用 JNA 表示Structure。
@FieldOrder({ "a", "b" })
class MyitemT extends Structure {
public int a;
public int b;
}
由于本機代碼正在處理記憶體分配,因此您所需要的只是指向它的指標。而不是指標大小的記憶體分配,您可能想要一個PointerByReference.
PointerByReference items = new PointerByReference();
你想要的關鍵方法是getPointer()(指向指標的指標)和getValue()(指向的值)。
鑒于上述情況,將指向指標的指標傳遞給方法,該方法將分配記憶體并填充值。
使用您已經擁有的映射(未顯示但推斷):
int n = CLibrary.INSTANCE.get_items(items.getPointer());
但是,您實際上應該映射get_items()以獲取PointerByReference引數,然后您可以直接傳遞items。
此時,items.getValue()是Pointer結構陣列的開始。根據結構的大小 ( ),其他專案將位于指標值的偏移量處item.size()。有多種方法可以做到這一點。
- 在你的情況下,因為你知道你只有成對的整數,你可以跳過整個“結構”部分,只使用
items.getValue().getInt(0)anditems.getValue().getInt(4)作為第一對;第二對為 8 和 12,依此類推...- 更好的是,只需
items.getValue().getIntArray(0,n*2);獲取一個整數陣列,只需將它們成對拉出即可。
- 更好的是,只需
- 可能是最 JNA-ish 的選擇:您可以使用
Structure.toArray()創建結構陣列MyitemT,然后設定結構的記憶體以匹配您在每個偏移量處分配的記憶體;然后read()進入你的陣列:
MyitemT[] array = (MyitemT[]) new MyitemT().toArray(n);
for (int i = 0; i < n; i ) {
array[i].useMemory(items.getValue(), i * item.size());
array[i].read();
// now you can see array[i].a and array[i].b
}
不要忘記最終釋放本機分配的記憶體,但 API 會告訴你!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484438.html
