为什么我的JNA结构映射产生奇怪的字段值
Why does my JNA Structure mapping produce strange field values?
我正试图从Mathlab生成的dll调用函数。它似乎可以在C中工作,但当我尝试使用jna时,它会返回奇怪的结果。
我正在尝试用以下签名调用函数:
emxArray_real32_T *emxCreate_real32_T(int rows, int cols);
的结构为:
struct emxArray_real32_T
{
float *data;
int *size;
int allocatedSize;
int numDimensions;
boolean_T canFreeData;
};
结构体在java中映射为:
public interface LibSoftEdge extends StdCallLibrary {
public static class emxArray_real32_T extends Structure{
public Pointer data ;
public Pointer size;
public int numDimensions;
public int allocatedSize;
public boolean canFreeData;
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{"allocatedSize","canFreeData",
"data","numDimensions","size"});
}
@Override
public String toString() {
return "emxArray_real32_T{" +
"data=" + data +
", size=" + size +
", allocatedSize=" + allocatedSize +
", numDimensions=" + numDimensions +
", canFreeData=" + canFreeData +
'}';
}
}
emxArray_real32_T emxCreate_real32_T(int rows, int cols);
}
,我用
LibSoftEdge libM = (LibSoftEdge) Native.loadLibrary("libsoftedge", LibSoftEdge.class);
LibSoftEdge.emxArray_real32_T test;
test = libM.emxCreate_real32_T(3,3);
在测试对象中,我得到奇怪的值和空指针。
当您像这样返回字段顺序时:
@Override
protected List getFieldOrder() {
return Arrays.asList("allocatedSize","canFreeData", "data","numDimensions","size");
}
您正在告诉JNA您的本地struct
看起来像这样:
struct emxArray_real32_T
{
int allocatedSize; // actually 'data'
boolean_T canFreeData; // actually 'size'
float *data; // actually 'allocatedSize'
int numDimensions;
int *size; // actually 'canFreeData'
};
因此,当JNA在Java端填充字段时,您的值将是不正确的,因为您实质上打乱了您的字段。
此外,根据boolean_T
的大小,您也可能会读取不对齐的数据,甚至可能最终导致崩溃。
你的getFieldOrder()
应该是这样的:
@Override
protected List getFieldOrder() {
return Arrays.asList("data", "size", "allocatedSize", "numDimensions", "canFreeData");
}
最后,如果您想为boolean_T
使用Java boolean
,而boolean_T
的大小不是4个字节,那么您需要使用TypeMapper
来确保正确转换类型。
相关文章:
- 从字符串流中读取具有特定字段宽度的 int
- 错误:字段'dateOfBirth'的类型不完整'Poco::Data::Date'
- 实例化时结构字段中的默认值
- 获取具有字段名称的 SELECT 字段类型,并带有 MariaDB C++连接器
- python.clang AST 解析:获取字段声明的 c++ 模板参数
- 位字段附近的变量会损坏吗?
- 确定输入"conscalc: calc"的类型时出错。不能联合编码器。具有不同字段集的结构类型
- 为什么字段中的第二个变量没有更改
- 使用静态类成员而不是私有字段之间的速度差异是什么?
- 将指向结构的指针转换为具有较少字段数的另一种结构类型
- 位字段成员的类型
- PCL:找不到字段'rgba'的匹配项
- 没有新字段 c++ 的派生类的非虚拟销毁
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化
- 存储和检索位字段中的有符号值
- 通过另一个对象C++的字段中的指针访问对象
- 将迭代器映射到特定字段上的迭代器(可以使用 Boost)
- 如何删除重复字段中的任意对象?(普罗托布夫)
- 结构字段上的智能指针
- 来自 gcc 原子标头的对我的类静态字段错误的未定义引用