From ea2117bdc03316a9292e2344c6fd157c85c13167 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 20 May 2011 10:37:34 -0700 Subject: [PATCH] Add ParcelFileDescriptor.fromFd() and .adoptFd(). Change-Id: I2fe0429188dc80abaa0c8977f2e43a010e0f4da2 --- api/current.xml | 28 ++++++++++ .../java/android/os/ParcelFileDescriptor.java | 56 +++++++++++++++---- core/jni/android_os_ParcelFileDescriptor.cpp | 42 ++++++++++++-- 3 files changed, 111 insertions(+), 15 deletions(-) diff --git a/api/current.xml b/api/current.xml index a44442a2cfe74..a7555da4c5c62 100644 --- a/api/current.xml +++ b/api/current.xml @@ -150303,6 +150303,19 @@ + + + + + + + + + + NewObject(gFileDescriptorOffsets.mClass, + gFileDescriptorOffsets.mConstructor); + if (fileDescriptorClone != NULL) { + env->SetIntField(fileDescriptorClone, gFileDescriptorOffsets.mDescriptor, fd); + } + return fileDescriptorClone; +} + +static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromFdNoDup(JNIEnv* env, + jobject clazz, jint fd) +{ + jobject fileDescriptorClone = env->NewObject(gFileDescriptorOffsets.mClass, + gFileDescriptorOffsets.mConstructor); + if (fileDescriptorClone != NULL) { + env->SetIntField(fileDescriptorClone, gFileDescriptorOffsets.mDescriptor, fd); + } + return fileDescriptorClone; +} + static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromSocket(JNIEnv* env, jobject clazz, jobject object) { @@ -61,17 +88,20 @@ static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromSocket(JNIEn jobject fileDescriptorClone = env->NewObject(gFileDescriptorOffsets.mClass, gFileDescriptorOffsets.mConstructor); if (fileDescriptorClone != NULL) { + // XXXX need to throw an exception if the dup fails! env->SetIntField(fileDescriptorClone, gFileDescriptorOffsets.mDescriptor, dup(fd)); } return fileDescriptorClone; } -static int android_os_ParcelFileDescriptor_createPipeNative(JNIEnv* env, +static void android_os_ParcelFileDescriptor_createPipeNative(JNIEnv* env, jobject clazz, jobjectArray outFds) { int fds[2]; if (pipe(fds) < 0) { - return -errno; + int therr = errno; + jniThrowException(env, "java/io/IOException", strerror(therr)); + return; } for (int i=0; i<2; i++) { @@ -82,8 +112,6 @@ static int android_os_ParcelFileDescriptor_createPipeNative(JNIEnv* env, } env->SetObjectArrayElement(outFds, i, fdObj); } - - return 0; } static jint getFd(JNIEnv* env, jobject clazz) @@ -138,9 +166,13 @@ static jlong android_os_ParcelFileDescriptor_getFdNative(JNIEnv* env, jobject cl } static const JNINativeMethod gParcelFileDescriptorMethods[] = { + {"getFileDescriptorFromFd", "(I)Ljava/io/FileDescriptor;", + (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromFd}, + {"getFileDescriptorFromFdNoDup", "(I)Ljava/io/FileDescriptor;", + (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromFdNoDup}, {"getFileDescriptorFromSocket", "(Ljava/net/Socket;)Ljava/io/FileDescriptor;", (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromSocket}, - {"createPipeNative", "([Ljava/io/FileDescriptor;)I", + {"createPipeNative", "([Ljava/io/FileDescriptor;)V", (void*)android_os_ParcelFileDescriptor_createPipeNative}, {"getStatSize", "()J", (void*)android_os_ParcelFileDescriptor_getStatSize},