Arrays JNA阵列结构

Arrays JNA阵列结构,arrays,structure,jna,access-violation,Arrays,Structure,Jna,Access Violation,我想在Java中使用dll(IEC驱动程序),因为我正在使用JNA。伪代码中的问题: 启动服务器 为阵列(JNA)分配新内存 客户端连接 将值从数组写入内存 正在将此阵列发送到客户端 客户端断开连接 新客户端连接 为数组分配新内存(JNA)->JVM崩溃(异常\访问\冲突) JVM崩溃不是由primitve数据类型造成的,也不是因为值不会从数组写入内存 c语言中的代码: struct DataAttributeData CrvPtsArrayDAData = {0}; CrvPtsArra

我想在Java中使用dll(IEC驱动程序),因为我正在使用JNA。伪代码中的问题:

  • 启动服务器
  • 为阵列(JNA)分配新内存
  • 客户端连接
  • 将值从数组写入内存
  • 正在将此阵列发送到客户端
  • 客户端断开连接
  • 新客户端连接
  • 为数组分配新内存(JNA)->JVM崩溃(异常\访问\冲突)
JVM崩溃不是由primitve数据类型造成的,也不是因为值不会从数组写入内存

c语言中的代码:

struct DataAttributeData CrvPtsArrayDAData = {0};

CrvPtsArrayDAData.ucType = DATATYPE_ARRAY; 
CrvPtsArrayDAData.pvData = XYValDAData;  


XYValDAData[0].ucType = FLOAT;
XYValDAData[0].uiBitLength = sizeof(Float32)*8;
XYValDAData[0].pvData = &(inUpdateValue.xVal);


XYValDAData[1].ucType = FLOAT;
XYValDAData[1].uiBitLength = sizeof(Float32)*8;
XYValDAData[1].pvData = &(inUpdateValue.yVal);


Send(&CrvPtsArrayDAData, 1);
Java中的代码:

DataAttributeData[] data_array = (DataAttributeData[]) new DataAttributeData()
                        .toArray(d.bitLength);

for (DataAttributeData d_temp : data_array) {

    d_temp.data = new Memory(size / 8);
    d_temp.type = type_iec;
    d_temp.bitLength = size;
    d_temp.write();
}

d.data = data_array[0].getPointer();
然后使用以下代码编写值:

for (int i = 0; i < arraySize; i++) {
    DataAttributeData dataAttr = new DataAttributeData(d.data.share(i * d.size()));
    dataAttr.read();
    dataAttr.data.setFloat(0, f[i]);
    dataAttr.write();
}
java中的结构:

public static class DataAttributeData extends Structure {

    public DataAttributeData(Pointer p) {
        // TODO Auto-generated constructor stub

        super(p);
    }

    public DataAttributeData() {
        // TODO Auto-generated constructor stub

        super();
    }

    public byte type;
    public int iArrayIndex;
    public int bitLength;
    public Pointer data;

    @Override
    protected List<String> getFieldOrder() {
        // TODO Auto-generated method stub
        return Arrays.asList(new String[] { "type", "iArrayIndex",
                "bitLength", "data" });
    }
}
公共静态类DataAttributeData扩展结构{
公共数据属性数据(指针p){
//TODO自动生成的构造函数存根
超级(p);
}
公共数据属性数据(){
//TODO自动生成的构造函数存根
超级();
}
公共字节类型;
公共综合指数;
公共整数位长度;
公共指针数据;
@凌驾
受保护列表getFieldOrder(){
//TODO自动生成的方法存根
返回Arrays.asList(新字符串[]{“type”,“iArrayIndex”,
“位长度”、“数据”});
}
}

有人能帮我吗?

显示相关结构的C定义和Java映射。您仍然缺少整体逻辑。更新问题的第一部分,概述您在伪代码中所做的工作。问题是你所尝试的操作缺乏连贯的模型。
public static class DataAttributeData extends Structure {

    public DataAttributeData(Pointer p) {
        // TODO Auto-generated constructor stub

        super(p);
    }

    public DataAttributeData() {
        // TODO Auto-generated constructor stub

        super();
    }

    public byte type;
    public int iArrayIndex;
    public int bitLength;
    public Pointer data;

    @Override
    protected List<String> getFieldOrder() {
        // TODO Auto-generated method stub
        return Arrays.asList(new String[] { "type", "iArrayIndex",
                "bitLength", "data" });
    }
}