JNative 参数问题,求解
do_read_proc
函数声明
DSCDLLAPI int HDCALL do_read_proc(data_record *recdPtr,char *mess,BOOL reply);
描述
本函数用来读取DTU发送过来的数据,并且进行处理:
收到的数据是DTU的注册包时,将自动给DTU返回确认信息,并改写recdPtr参数(该参数的具体值请看DTU数据结构);
收到的数据是DTU的数据包时,将把数据分解到recdPtr参数,如果reply参数设置为TRUE,将对本次收到的DTU数据进行应答(一般测试程序时可设置为TRUE,发布程序时设置为FALSE);
收到的是无效数据包时,表明DSC上一次发送给DTU的数据包存在错误,这种情况通常出现在参数配置时,对参数的赋值出现错误;
收到的是参数查询应答包时,用户可以调用GetParam函数来对参数进行读取;
收到的是参数设置成功应答包时,表明DTU已经成功完成参数设置。
由于do_read_proc内部集合了处理DDP协议包的功能,因此编程时必须保证该函数被高频率的执行,以保证DTU注册和心跳可以成功。可以采用消息模式(SetWorkMode(2)),当消息触发的时候,马上执行do_read_proc;或者采用非阻塞方式,启用一个定时器,每过一小段时间(最好小于500毫秒)执行一次do_read_proc。
do_read_proc函数有三种读取方式:阻塞、非阻塞、消息方式,这些方式可由SetWorkMode函数来设定。
当SetWorkMode设置为0时,do_read_proc处于阻塞读取方式,do_read_proc函数只有读取到数据时才会返回。在这种方式下程序应该设计为多线程方式,当要关闭服务时,需要调用cancel_read_block函数。
当SetWorkMode设置为1时,do_read_proc处于非阻塞方式,无论能否读取到数据,do_read_proc函数都将立即返回。这种方式下的程序可以采用多线程或定时器方式进行设计。
当SetWorkMode设置为2时,start_net_service函数的hWnd参数和wMsg参数必须设置成有意义的值,当有DTU数据到达DSC时,将触发wMsg消息到hWnd,此时程序应该马上执行do_read_proc。
参数
recdPtr 存放数据的结构指针。可以根据其成员m_data_type来判断收到的数据类型。
mess 执行信息缓存,如果不需要,可以设置为NULL。
reply 收到用户数据后是否给DTU应答。
返回值
如果读取到数据,返回0;否则返回-1。
需要注意的时,当设置为非阻塞方式时,返回-1只是表明没有读取到数据,而不是发生错误。
第三个参数为boolean类型参数,各位大侠帮忙。
函数声明
DSCDLLAPI int HDCALL do_read_proc(data_record *recdPtr,char *mess,BOOL reply);
描述
本函数用来读取DTU发送过来的数据,并且进行处理:
收到的数据是DTU的注册包时,将自动给DTU返回确认信息,并改写recdPtr参数(该参数的具体值请看DTU数据结构);
收到的数据是DTU的数据包时,将把数据分解到recdPtr参数,如果reply参数设置为TRUE,将对本次收到的DTU数据进行应答(一般测试程序时可设置为TRUE,发布程序时设置为FALSE);
收到的是无效数据包时,表明DSC上一次发送给DTU的数据包存在错误,这种情况通常出现在参数配置时,对参数的赋值出现错误;
收到的是参数查询应答包时,用户可以调用GetParam函数来对参数进行读取;
收到的是参数设置成功应答包时,表明DTU已经成功完成参数设置。
由于do_read_proc内部集合了处理DDP协议包的功能,因此编程时必须保证该函数被高频率的执行,以保证DTU注册和心跳可以成功。可以采用消息模式(SetWorkMode(2)),当消息触发的时候,马上执行do_read_proc;或者采用非阻塞方式,启用一个定时器,每过一小段时间(最好小于500毫秒)执行一次do_read_proc。
do_read_proc函数有三种读取方式:阻塞、非阻塞、消息方式,这些方式可由SetWorkMode函数来设定。
当SetWorkMode设置为0时,do_read_proc处于阻塞读取方式,do_read_proc函数只有读取到数据时才会返回。在这种方式下程序应该设计为多线程方式,当要关闭服务时,需要调用cancel_read_block函数。
当SetWorkMode设置为1时,do_read_proc处于非阻塞方式,无论能否读取到数据,do_read_proc函数都将立即返回。这种方式下的程序可以采用多线程或定时器方式进行设计。
当SetWorkMode设置为2时,start_net_service函数的hWnd参数和wMsg参数必须设置成有意义的值,当有DTU数据到达DSC时,将触发wMsg消息到hWnd,此时程序应该马上执行do_read_proc。
参数
recdPtr 存放数据的结构指针。可以根据其成员m_data_type来判断收到的数据类型。
mess 执行信息缓存,如果不需要,可以设置为NULL。
reply 收到用户数据后是否给DTU应答。
返回值
如果读取到数据,返回0;否则返回-1。
需要注意的时,当设置为非阻塞方式时,返回-1只是表明没有读取到数据,而不是发生错误。
public class DataRecord extends AbstractBasicData<DataRecord> {
private static final int MAX_RECEIVE_BUF = 1024;
byte[] m_userid = new byte[12]; // 终端模块号码m_userid(1 To 12) As Byte
byte[] m_recv_date = new byte[20]; // 接收到数据包的时间m_recv_date(1 To 20) As Byte
byte[] m_data_buf = new byte[MAX_RECEIVE_BUF]; // 存储接收到的数据m_data_buf(1 To MAX_RECEIVE_BUF) As Byte
short m_data_len; // 接收到的数据包长度m_data_len As Integer
byte m_data_type; // 接收到的数据包类型m_data_type As Byte
public DataRecord() throws NativeException {
super(null);
createPointer();
mValue = this;
}
public Pointer createPointer() throws NativeException {
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
return pointer;
}
public int getSizeOf() {
return 12 + 20 + 1024 + 16 + 1; // 8 WORDS of 2 bytes
}
public DataRecord getValueFromPointer() throws NativeException {
for(int i=0; i< m_userid.length; i++){
m_userid[i] = getNextByte();
}
for(int i=0; i< m_recv_date.length; i++){
m_recv_date[i] = getNextByte();
}
for(int i=0; i< m_data_buf.length; i++){
m_data_buf[i] = getNextByte();
}
m_data_len = getNextShort();
m_data_type = getNextByte();
return this;
}
public static DataRecord nGetDataRecord() throws NativeException, IllegalAccessException {
JNative nGetDataRecord = new JNative("wcomm_dll.dll", "do_read_proc");
DataRecord dataRecord = new DataRecord();
nGetDataRecord.setParameter(0, dataRecord.getPointer());
nGetDataRecord.setParameter(1, new NullPointer());
//nGetDataRecord.setParameter(2, ??);
nGetDataRecord.invoke();// 调用方法
return dataRecord.getValueFromPointer();
}
public static void main(String[] args) throws NativeException, IllegalAccessException {
DataRecord dataRecord = nGetDataRecord();
System.out.println("m_data_type:"+dataRecord.m_data_type);
System.out.println("m_data_len:"+dataRecord.m_data_len);
System.out.print("m_userid:");
for(int i=0; i< dataRecord.m_userid.length; i++){
System.out.print(dataRecord.m_userid[i]);
}
System.out.println();
System.out.print("m_recv_date:");
for(int i=0; i< dataRecord.m_recv_date.length; i++){
System.out.print(dataRecord.m_recv_date[i]);
}
System.out.println();
System.out.print("m_data_buf:");
for(int i=0; i< dataRecord.m_data_buf.length; i++){
System.out.print(dataRecord.m_data_buf[i]);
}
System.out.println();
}
}
第三个参数为boolean类型参数,各位大侠帮忙。
...全文
相关推荐
jnative下载
**JNative.jar**:这是一个Java Archive文件,包含了JNative的Java类库。当你在Java程序中导入这个库时,就可以使用JNative提供的API来调用本地方法。
JNative.jar以及JNative源码
本文将详细介绍JNative.jar及其相关组件,以及如何利用JNative源码来实现跨平台的本地方法调用。首先,我们来看JNative.jar。
JNative所有文件
然而,使用JNative也需要注意性能和安全问题,因为Java与本地代码交互可能会引入额外的开销,而且错误的本地代码调用可能会导致系统崩溃。
JNative api说明文档
对于JNative API来说,Javadoc文件包含了每个接口、类、方法的描述、参数、返回值、异常等信息,是学习和使用JNative的重要资源。
在Java程序中使用JNative调用dll文件
总的来说,JNative为Java程序员提供了一个更加便利的方式来调用本地代码,减轻了对JNI底层细节的理解和操作负担。然而,这也意味着一旦遇到问题,可能需要对JNI有一定的了解才能有效地排查和解决。


