Loading core/java/android/os/Parcel.java +3 −5 Original line number Diff line number Diff line Loading @@ -295,6 +295,7 @@ public final class Parcel { private static native long nativeWriteFileDescriptor(long nativePtr, FileDescriptor val); private static native byte[] nativeCreateByteArray(long nativePtr); private static native boolean nativeReadByteArray(long nativePtr, byte[] dest, int destLen); private static native byte[] nativeReadBlob(long nativePtr); @FastNative private static native int nativeReadInt(long nativePtr); Loading Loading @@ -2217,11 +2218,8 @@ public final class Parcel { * given byte array. */ public final void readByteArray(byte[] val) { // TODO: make this a native method to avoid the extra copy. byte[] ba = createByteArray(); if (ba.length == val.length) { System.arraycopy(ba, 0, val, 0, ba.length); } else { boolean valid = nativeReadByteArray(mNativePtr, val, (val != null) ? val.length : 0); if (!valid) { throw new RuntimeException("bad array lengths"); } } Loading core/jni/android_os_Parcel.cpp +26 −3 Original line number Diff line number Diff line Loading @@ -168,8 +168,8 @@ static void android_os_Parcel_restoreAllowFds(JNIEnv* env, jclass clazz, jlong n } } static void android_os_Parcel_writeNative(JNIEnv* env, jclass clazz, jlong nativePtr, jobject data, jint offset, jint length) static void android_os_Parcel_writeByteArray(JNIEnv* env, jclass clazz, jlong nativePtr, jobject data, jint offset, jint length) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel == NULL) { Loading Loading @@ -350,6 +350,28 @@ static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jclass clazz, j return ret; } static jboolean android_os_Parcel_readByteArray(JNIEnv* env, jclass clazz, jlong nativePtr, jobject dest, jint destLen) { jboolean ret = JNI_FALSE; Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel == NULL) { return ret; } int32_t len = parcel->readInt32(); if (len >= 0 && len <= (int32_t)parcel->dataAvail() && len == destLen) { jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)dest, 0); if (ar) { const void* data = parcel->readInplace(len); memcpy(ar, data, len); env->ReleasePrimitiveArrayCritical((jarray)dest, ar, 0); ret = JNI_TRUE; } } return ret; } static jbyteArray android_os_Parcel_readBlob(JNIEnv* env, jclass clazz, jlong nativePtr) { jbyteArray ret = NULL; Loading Loading @@ -761,7 +783,7 @@ static const JNINativeMethod gParcelMethods[] = { // @FastNative {"nativeRestoreAllowFds", "(JZ)V", (void*)android_os_Parcel_restoreAllowFds}, {"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeNative}, {"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeByteArray}, {"nativeWriteBlob", "(J[BII)V", (void*)android_os_Parcel_writeBlob}, // @FastNative {"nativeWriteInt", "(JI)V", (void*)android_os_Parcel_writeInt}, Loading @@ -776,6 +798,7 @@ static const JNINativeMethod gParcelMethods[] = { {"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", (void*)android_os_Parcel_writeFileDescriptor}, {"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray}, {"nativeReadByteArray", "(J[BI)Z", (void*)android_os_Parcel_readByteArray}, {"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob}, // @FastNative {"nativeReadInt", "(J)I", (void*)android_os_Parcel_readInt}, Loading Loading
core/java/android/os/Parcel.java +3 −5 Original line number Diff line number Diff line Loading @@ -295,6 +295,7 @@ public final class Parcel { private static native long nativeWriteFileDescriptor(long nativePtr, FileDescriptor val); private static native byte[] nativeCreateByteArray(long nativePtr); private static native boolean nativeReadByteArray(long nativePtr, byte[] dest, int destLen); private static native byte[] nativeReadBlob(long nativePtr); @FastNative private static native int nativeReadInt(long nativePtr); Loading Loading @@ -2217,11 +2218,8 @@ public final class Parcel { * given byte array. */ public final void readByteArray(byte[] val) { // TODO: make this a native method to avoid the extra copy. byte[] ba = createByteArray(); if (ba.length == val.length) { System.arraycopy(ba, 0, val, 0, ba.length); } else { boolean valid = nativeReadByteArray(mNativePtr, val, (val != null) ? val.length : 0); if (!valid) { throw new RuntimeException("bad array lengths"); } } Loading
core/jni/android_os_Parcel.cpp +26 −3 Original line number Diff line number Diff line Loading @@ -168,8 +168,8 @@ static void android_os_Parcel_restoreAllowFds(JNIEnv* env, jclass clazz, jlong n } } static void android_os_Parcel_writeNative(JNIEnv* env, jclass clazz, jlong nativePtr, jobject data, jint offset, jint length) static void android_os_Parcel_writeByteArray(JNIEnv* env, jclass clazz, jlong nativePtr, jobject data, jint offset, jint length) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel == NULL) { Loading Loading @@ -350,6 +350,28 @@ static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jclass clazz, j return ret; } static jboolean android_os_Parcel_readByteArray(JNIEnv* env, jclass clazz, jlong nativePtr, jobject dest, jint destLen) { jboolean ret = JNI_FALSE; Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel == NULL) { return ret; } int32_t len = parcel->readInt32(); if (len >= 0 && len <= (int32_t)parcel->dataAvail() && len == destLen) { jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)dest, 0); if (ar) { const void* data = parcel->readInplace(len); memcpy(ar, data, len); env->ReleasePrimitiveArrayCritical((jarray)dest, ar, 0); ret = JNI_TRUE; } } return ret; } static jbyteArray android_os_Parcel_readBlob(JNIEnv* env, jclass clazz, jlong nativePtr) { jbyteArray ret = NULL; Loading Loading @@ -761,7 +783,7 @@ static const JNINativeMethod gParcelMethods[] = { // @FastNative {"nativeRestoreAllowFds", "(JZ)V", (void*)android_os_Parcel_restoreAllowFds}, {"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeNative}, {"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeByteArray}, {"nativeWriteBlob", "(J[BII)V", (void*)android_os_Parcel_writeBlob}, // @FastNative {"nativeWriteInt", "(JI)V", (void*)android_os_Parcel_writeInt}, Loading @@ -776,6 +798,7 @@ static const JNINativeMethod gParcelMethods[] = { {"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", (void*)android_os_Parcel_writeFileDescriptor}, {"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray}, {"nativeReadByteArray", "(J[BI)Z", (void*)android_os_Parcel_readByteArray}, {"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob}, // @FastNative {"nativeReadInt", "(J)I", (void*)android_os_Parcel_readInt}, Loading