Arrays JNA阵列结构
我想在Java中使用dll(IEC驱动程序),因为我正在使用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
- 启动服务器
- 为阵列(JNA)分配新内存
- 客户端连接
- 将值从数组写入内存
- 正在将此阵列发送到客户端
- 客户端断开连接
- 新客户端连接
- 为数组分配新内存(JNA)->JVM崩溃(异常\访问\冲突)
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" });
}
}