通过引用,C结构中的JNA多个void指针

问题描述 投票:0回答:1

在我当前的项目中,我必须在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时,如何处理通过引用传递的结构中的多个动态内存字段?是否可以在结构内部保留未初始化的指针?

我非常感谢您的帮助。预先谢谢你。

在我当前的项目中,我必须在Java项目中实现本机c库的功能。我正在使用JNA。到目前为止,已经取得了一些不错的成绩。现在,我陷入了以下问题。我必须打电话给...

java c pointers struct jna
1个回答
0
投票

感谢所有试图帮助我的人。您使我走上了正确的轨道。

© www.soinside.com 2019 - 2024. All rights reserved.