使用FileChannel.transferTo时,奇怪的JNI崩溃

时间:2015-03-02 21:26:28

标签: java android java-native-interface nio

我正在使用FileChannel.transferTo方法将字节从本地文件传输到网络套接字。当套接字的另一端关闭连接时,要么在通道上使用.close,要么由于某些错误,我在Android应用程序中得到一个非常长的JNI error stack-Strace

我能理解的部分是:

  1. 崩溃发生在以下行:

    fileChannel.transferTo                             (offset,bytesSize,channel);

  2. 错误:

  3.   

    应用程序中的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”之后的应用程序崩溃吗?

0 个答案:

没有答案