我想在C DLL中調用一個函數,該函數需要一個指向結構體的指針。這個結構(Data
)的定義是這樣的:如何使用指向Java指針的指針填充結構?
struct BD
{
char* Data;
int Length;
};
struct EE
{
char* Key;
BD* Value;
};
struct Data
{
char* Name;
BD* Picture;
// A NULL-terminated array of pointers to EE structures.
EE** Elements;
};
在Java中我已經定義了一些類,像這樣:
public static class BD extends Structure implements Structure.ByReference {
public byte[] Data;
public int Length;
}
public static class EE extends Structure implements Structure.ByReference {
public String Key;
public BD Value;
}
public static class Data extends Structure {
public String Name;
public BD Picture;
public PointerByReference Elements;
}
但現在我不知道究竟如何填充Data
對象正確。我想我可以計算出Name
和Picture
字段,但是我怎樣將Elements
字段設置爲?我可以創建一個EE
對象的Java數組,但是如何從中獲取PointerByReference?也許我需要將Elements
聲明爲Pointer[]
,但是接下來我只需要爲每個EE
對象填充數組的每個元素,即getPointer()
對象?雖然這看起來不太合適?
編輯:給的什麼,我試圖做一個更好的主意:
Data data = new Data();
// Fill in Name and Picture fields.
EE[] elements = new Elements[10];
// Fill in the elements array.
// Now how do I set the Elements field on the data object from the elements array?
data.Elements = ???
EDIT2:這是我如何與technomage的幫助下解決了這個問題:
我改變了我的Data
結構看起來像這樣:
public static class Data extends Structure {
public String Name;
public BD Picture;
public Pointer Elements;
}
而我的BD
結構是這樣的:
public static class BD extends Structure implements Structure.ByReference {
public Pointer Data;
public int Length;
}
將Java byte[]
轉換爲JNA Pointer
我不得不使用ByteBuffer
:
ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length);
buf.put(bytes);
bd.Data = Natvie.getDirectBufferPointer(buf);
JNA不以struture喜歡ByteBuffer
小號不幸。
爲了讓我的元素的指針,我需要創建的Pointer
s到每個EE
對象的數組(參見technomage的答案PointerArray
實現):
EE e = new EE();
// Populate e object.
// ...
// Important: ensure that the contents of the objects are written out to native memory since JNA can't do this automatically
e.write();
ptrs.add(e);
// Once each object is setup we can simply take the array of pointers and use the PointerArray
data.Elements = new PointerArray(ptrs.toArray(new Pointer[0]));
我不能使用ByteBuffer
或PointerArray
直接在結構定義,所以我不得不依靠Pointer
。
當您另外傳遞指針變量的地址時,將使用'PointerByReference',以便爲被調用者提供空間以「返回」一個值。 – technomage
如果您的本地'struct'使用'char []'作爲相應的字段類型,則只能使用'byte []'作爲'Structure'字段。 – technomage