[英]JNA multiple void pointers inside a C struct by reference
在我目前的項目中,我必須在一個java項目中實現原生c庫的功能。 我正在使用 JNA。 並且到目前為止取得了一些不錯的結果。 現在我被困在以下問題上。
我必須調用本機 c 函數:
int retrieveResult(ResultStruct * pResult)
結構定義如下:
typedef struct tag_ResultStruct
{
const void *pBuffer;
int sizeX;
int sizeY;
} ResultStruct;
在 Java 中,我創建了一個表示結構的類:
public class ResultStruct extends Structure{
public Pointer pBuffer;
public int sizeX;
public int sizeY;
@Override
protected List<String> getFieldOrder(){
return Arrays.asList(new String[] {"pBuffer", "sizeX", "sizeY"});
}
public ResultStruct(){
}
}
我正在調用本機 C 方法
private interface MyCLib extends Library{
MyCLib INSTANCE = Native.load("myclib", MyCLib.class);
int retrieveResult(ResultStruct pResult);
}
ResultStruct resultStruct = new ResultStruct();
resultStruct.pBuffer = new Memory(bufferLen);
int res = MyCLib.INSTANCE.retrieveResult(resultStruct);
現在我可以從 sizeX、sizeY 和 pBuffer 中檢索預期值
resultStruct.pBuffer.getByteArray(0, bufferLen);
現在我像下面這樣擴展我的結構:
typedef struct tag_ResultStruct
{
const void* pContext;
const void *pBuffer;
int sizeX;
int sizeY;
} ResultStruct;
還有我的 Java 結構:
public class ResultStruct extends Structure{
public Pointer pContext;
public Pointer pBuffer;
public int sizeX;
public int sizeY;
@Override
protected List<String> getFieldOrder(){
return Arrays.asList(new String[] {"pContext", "pBuffer", "sizeX", "sizeY"});
}
public ResultStruct(){
}
}
問題是,我不想使用 pContext。 所以我不知道它應該有多大,因此我不初始化指針。 現在,當我嘗試通過調用從緩沖區中檢索值時:
resultStruct.pBuffer.getByteArray(0, bufferLen);
我沒有從緩沖區獲得預期值。
使用 JNA 時如何處理通過引用傳遞的結構中的多個動態內存字段? 是否可以在結構內保留未初始化的指針?
我很感激任何幫助。 先感謝您。
謝謝大家,誰回答了我的問題。 你讓我走上了正軌。
這是我的問題的答案。 也許它可以幫助其他遇到相同或類似問題的人。
在我使用的庫(Basler 的 Pylon C API)中提到您必須注冊一個或多個輸出緩沖區。 它是通過分配緩沖區並注冊該數組的指針來完成的。
通常我將一個字節數組( byte[] buffer = new byte[size]
)映射到一個 uchar* 或 void* 緩沖區。 這是有效的,當緩沖區直接填充到你的 c 函數中時(就像在 Oo.oO 給我的示例中)。
但是在我使用的 API 的上下文中,指針在注冊后稍后會被填充(它被填充,當圖像數據可用時)。 我不是專家,但我認為 java 字節數組不像真正的指針那樣工作。
我將 Java 中的緩沖區分配更改為
Pointer pBuffer = new Memory(size)
並在注冊時將此指針映射到 void* 緩沖區指針。 現在緩沖區指針按預期工作,我可以稍后通過使用檢索緩沖區的內容
byte[] data = pBuffer.getByteArray(0, size)
當函數retrieveResult(...)
返回的指針在結構內時,這也有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.