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