在我当前的项目中,我必须在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。到目前为止,已经取得了一些不错的成绩。现在,我陷入了以下问题。我必须打电话给...
感谢所有试图帮助我的人。您使我走上了正确的轨道。