问题:
因为在平板显示是开线程接收CAN数据,而sokect在JNI接收数据的时候是阻塞方法。在关闭线程的时候,方法还是会在阻塞。
解决:
在jni里面修改socket阻塞,code:
if (-1 == fcntl(fd, F_SETFL, O_NONBLOCK))
{
printf("fcntl socket error!\n");
}
struct timeval tv;
tv.tv_sec = 500;
tv.tv_usec = 0;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
if (select(fd + 1,&readfds,NULL, NULL, &tv) <= 0)
{
return NULL;
}
// 接收数据,并判断,如果数据有问题,抛出异常信息
nbytes = recvfrom(fd, &frame, sizeof(frame), flags,
reinterpret_cast<struct sockaddr *>(&addr), &len);