summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2011-05-20 16:13:54 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2011-05-20 16:13:54 -0700
commit070a19e035cd28f2a0cc831f2322f2121d80de44 (patch)
tree714d23f6081489a5504fdbe262456f43f4f48c68 /core/jni
parent5a6bec53e224b2db9ecbc6920faab08f4a962256 (diff)
parent5c8caba2e590792531ffb2c9f4ea924993662abd (diff)
downloadframeworks_base-070a19e035cd28f2a0cc831f2322f2121d80de44.zip
frameworks_base-070a19e035cd28f2a0cc831f2322f2121d80de44.tar.gz
frameworks_base-070a19e035cd28f2a0cc831f2322f2121d80de44.tar.bz2
am 5c8caba2: am 1b144e62: Merge "Add ParcelFileDescriptor.fromFd() and .adoptFd()." into honeycomb-mr2
* commit '5c8caba2e590792531ffb2c9f4ea924993662abd': Add ParcelFileDescriptor.fromFd() and .adoptFd().
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/android_os_ParcelFileDescriptor.cpp42
1 files changed, 37 insertions, 5 deletions
diff --git a/core/jni/android_os_ParcelFileDescriptor.cpp b/core/jni/android_os_ParcelFileDescriptor.cpp
index 1f737f9..e73d30b 100644
--- a/core/jni/android_os_ParcelFileDescriptor.cpp
+++ b/core/jni/android_os_ParcelFileDescriptor.cpp
@@ -52,6 +52,33 @@ static struct parcel_file_descriptor_offsets_t
jfieldID mFileDescriptor;
} gParcelFileDescriptorOffsets;
+static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromFd(JNIEnv* env,
+ jobject clazz, jint origfd)
+{
+ int fd = dup(origfd);
+ if (fd < 0) {
+ jniThrowException(env, "java/io/IOException", strerror(errno));
+ return NULL;
+ }
+ jobject fileDescriptorClone = env->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},