diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java index c14925cd38394..03542ddaa9b78 100644 --- a/core/java/android/os/MemoryFile.java +++ b/core/java/android/os/MemoryFile.java @@ -52,7 +52,7 @@ public class MemoryFile private static native void native_write(FileDescriptor fd, int address, byte[] buffer, int srcOffset, int destOffset, int count, boolean isUnpinned) throws IOException; private static native void native_pin(FileDescriptor fd, boolean pin) throws IOException; - private static native boolean native_is_ashmem_region(FileDescriptor fd) throws IOException; + private static native int native_get_mapped_size(FileDescriptor fd) throws IOException; private FileDescriptor mFD; // ashmem file descriptor private int mAddress; // address of ashmem memory @@ -300,7 +300,20 @@ public class MemoryFile * @hide */ public static boolean isMemoryFile(FileDescriptor fd) throws IOException { - return native_is_ashmem_region(fd); + return (native_get_mapped_size(fd) >= 0); + } + + /** + * Returns the size of the memory file, rounded up to a page boundary, that + * the file descriptor refers to, or -1 if the file descriptor does not + * refer to a memory file. + * + * @throws IOException If fd is not a valid file descriptor. + * + * @hide + */ + public static int getMappedSize(FileDescriptor fd) throws IOException { + return native_get_mapped_size(fd); } /** diff --git a/core/jni/android_os_MemoryFile.cpp b/core/jni/android_os_MemoryFile.cpp index 8643393f7e8a4..1ae3ec715c4c6 100644 --- a/core/jni/android_os_MemoryFile.cpp +++ b/core/jni/android_os_MemoryFile.cpp @@ -118,7 +118,7 @@ static void android_os_MemoryFile_pin(JNIEnv* env, jobject clazz, jobject fileDe } } -static jboolean android_os_MemoryFile_is_ashmem_region(JNIEnv* env, jobject clazz, +static jint android_os_MemoryFile_get_mapped_size(JNIEnv* env, jobject clazz, jobject fileDescriptor) { int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); // Use ASHMEM_GET_SIZE to find out if the fd refers to an ashmem region. @@ -129,13 +129,13 @@ static jboolean android_os_MemoryFile_is_ashmem_region(JNIEnv* env, jobject claz if (errno == ENOTTY) { // ENOTTY means that the ioctl does not apply to this object, // i.e., it is not an ashmem region. - return JNI_FALSE; + return (jint) -1; } // Some other error, throw exception jniThrowIOException(env, errno); - return JNI_FALSE; + return (jint) -1; } - return JNI_TRUE; + return (jint) result; } static const JNINativeMethod methods[] = { @@ -146,8 +146,8 @@ static const JNINativeMethod methods[] = { {"native_read", "(Ljava/io/FileDescriptor;I[BIIIZ)I", (void*)android_os_MemoryFile_read}, {"native_write", "(Ljava/io/FileDescriptor;I[BIIIZ)V", (void*)android_os_MemoryFile_write}, {"native_pin", "(Ljava/io/FileDescriptor;Z)V", (void*)android_os_MemoryFile_pin}, - {"native_is_ashmem_region", "(Ljava/io/FileDescriptor;)Z", - (void*)android_os_MemoryFile_is_ashmem_region} + {"native_get_mapped_size", "(Ljava/io/FileDescriptor;)I", + (void*)android_os_MemoryFile_get_mapped_size} }; static const char* const kClassPathName = "android/os/MemoryFile";