簡體   English   中英

JNA 通過引用在 C 結構中使用多個空指針

[英]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.

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