status_t getParameter(int key, Parcel *reply)
 {
     Parcel data;
     data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
     data.writeInt32(key);
     return remote()->transact(GET_PARAMETER, data, reply);
 }
    status_t resume() {
        Parcel request;
        request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());

        Parcel reply;
        remote()->transact(RESUME, request, &reply);

        return reply.readInt32();
    }
    status_t suspend() {
        Parcel request;
        request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());

        Parcel reply;
        remote()->transact(SUSPEND, request, &reply);

        return reply.readInt32();
    }
 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
 {
     Parcel request;
     request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
     // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
     request.writeInt32(update_only);
     request.writeInt32(apply_filter);
     remote()->transact(GET_METADATA, request, reply);
     return reply->readInt32();
 }
static void android_os_Parcel_writeInterfaceToken(JNIEnv* env, jclass clazz, jint nativePtr,
                                                  jstring name)
{
    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
    if (parcel != NULL) {
        // In the current implementation, the token is just the serialized interface name that
        // the caller expects to be invoking
        const jchar* str = env->GetStringCritical(name, 0);
        if (str != NULL) {
            parcel->writeInterfaceToken(String16((const char16_t*)str, env->GetStringLength(name)));
            env->ReleaseStringCritical(name, str);
        }
    }
}
 virtual status_t pullBatteryData(Parcel* reply) {
     Parcel data;
     data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
     return remote()->transact(PULL_BATTERY_DATA, data, reply);
 }