gpt4 book ai didi

java - 为什么我的 JNA 结构映射会产生奇怪的字段值?

转载 作者:行者123 更新时间:2023-11-28 02:20:27 25 4
gpt4 key购买 nike

我正在尝试从 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 是除四个字节以外的任何大小,那么你需要使用 TypeMapper 确保类型正确转换。

关于java - 为什么我的 JNA 结构映射会产生奇怪的字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32712509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com