我正在使用FileChannel.transferTo方法将字节从本地文件传输到网络套接字。当套接字的另一端关闭连接时,要么在通道上使用.close,要么由于某些错误,我在Android应用程序中得到一个非常长的JNI error stack-Strace。
我能理解的部分是:
崩溃发生在以下行:
fileChannel.transferTo (offset,bytesSize,channel);
错误:
应用程序中的JNI检测错误:JNI SetLongField调用 挂起的异常'android.system.ErrnoException'抛出很长时间 libcore.io.Posix.sendfile(java.io.FileDescriptor中, java.io.FileDescriptor,android.util.MutableLong,long): - 2
这是我在transferTo调用后执行的Java代码:
在libcore.io.Posix.sendfile(Native方法)中 libcore.io.BlockGuardOs.sendfile(BlockGuardOs.java:265)at java.nio.FileChannelImpl.transferTo(FileChannelImpl.java:431)
从java源代码中,这是FileChannelImpl
中的第431行try {
MutableLong offset = new MutableLong(position);
long rc = Libcore.os.sendfile(outFd, fd, offset, count); //line 431
completed = true;
return rc;
} catch (ErrnoException errnoException) {
// If the OS doesn't support what we asked for, we want to fall through and
// try a different approach. If it does support it, but it failed, we're done.
if (errnoException.errno != ENOSYS && errnoException.errno != EINVAL) {
throw errnoException.rethrowAsIOException();
}
}
据我所知,应该抛出一个IO异常,因为ErrnoException被“重新抛出”为IOException。显然,当有一个待处理的异常时,正在设置Mutable-Long。虽然我对此表示怀疑,但是在某种程度上有一种方法可以防止这个“bug”之后的应用程序崩溃吗?