我在Android下访问串口时遇到问题。
为此,我使用JNI编写了一个串行库,具有打开,读写串口的简单功能。
private static class ReturnC{
public int retcode;
@SuppressWarnings("unused")
public int errno;
public String descripcionError;
}
private native ReturnC open_port(String portPath);
private native ReturnC set_speed(int fd, int speed);
...
private native ReturnC read_bytes_in_received_buffer(int fd, int cantidadMaximaALeer, byte[] buffer);
private native ReturnC send_buffer(int fs, byte[] buffer);
private native void close_port(int fd);
我在open_port调用中获取了开放端口的文件描述符,并使用它在读/写操作中引用该端口。
这很好用......有一段时间了。垃圾回收后,对fd的任何访问都会返回EBADF。果然,它已经不再有效了。如果我立即重新打开它,我可以继续使用该端口(在另一个或相同的fd编号下)。
所以,我猜它因为垃圾收集中发生的事情而被关闭了。我不是Java专家,尤其不是JNI专家,来自C背景。在我的世界中,文件描述符在显式关闭之前有效,或者进程退出,并且我很难在这里跟踪导致无效fd的条件。
我正在仔细阅读盛亮的JNI指南和规范,这有点过于庞大。有人可以帮忙吗?