diff options
author | James Dong <jdong@google.com> | 2012-05-11 16:45:19 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-11 16:45:19 -0700 |
commit | 909c4b855a372dbc70ce6777df64d12ae93ad2d5 (patch) | |
tree | 1a3987f0985b841177a7c24ee3a0f94cb418b0d3 /media/jni | |
parent | 7fc4fbccd6129e286a1f9c640eb3229b91792bce (diff) | |
parent | 8902097bb686752ff207e3bda12713be1a8c74eb (diff) | |
download | frameworks_base-909c4b855a372dbc70ce6777df64d12ae93ad2d5.zip frameworks_base-909c4b855a372dbc70ce6777df64d12ae93ad2d5.tar.gz frameworks_base-909c4b855a372dbc70ce6777df64d12ae93ad2d5.tar.bz2 |
Merge "Improve notifying TimedText by reducing marshall/unmarshalling." into jb-dev
Diffstat (limited to 'media/jni')
-rw-r--r-- | media/jni/android_media_MediaPlayer.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 5eadb3a..de22e09 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -72,6 +72,7 @@ private: JNIMediaPlayerListener(); jclass mClass; // Reference to MediaPlayer class jobject mObject; // Weak ref to MediaPlayer Java object to call on + jobject mParcel; }; JNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz) @@ -90,6 +91,7 @@ JNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobjec // We use a weak reference so the MediaPlayer object can be garbage collected. // The reference is only used as a proxy for callbacks. mObject = env->NewGlobalRef(weak_thiz); + mParcel = env->NewGlobalRef(createJavaParcelObject(env)); } JNIMediaPlayerListener::~JNIMediaPlayerListener() @@ -98,25 +100,30 @@ JNIMediaPlayerListener::~JNIMediaPlayerListener() JNIEnv *env = AndroidRuntime::getJNIEnv(); env->DeleteGlobalRef(mObject); env->DeleteGlobalRef(mClass); + + recycleJavaParcelObject(env, mParcel); + env->DeleteGlobalRef(mParcel); } void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj) { JNIEnv *env = AndroidRuntime::getJNIEnv(); if (obj && obj->dataSize() > 0) { - jbyteArray jArray = env->NewByteArray(obj->dataSize()); - if (jArray != NULL) { - jbyte *nArray = env->GetByteArrayElements(jArray, NULL); - memcpy(nArray, obj->data(), obj->dataSize()); - env->ReleaseByteArrayElements(jArray, nArray, 0); + if (mParcel != NULL) { + Parcel* nativeParcel = parcelForJavaObject(env, mParcel); + nativeParcel->setData(obj->data(), obj->dataSize()); env->CallStaticVoidMethod(mClass, fields.post_event, mObject, - msg, ext1, ext2, jArray); - env->DeleteLocalRef(jArray); + msg, ext1, ext2, mParcel); } } else { env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, NULL); } + if (env->ExceptionCheck()) { + ALOGW("An exception occurred while notifying an event."); + LOGW_EX(env); + env->ExceptionClear(); + } } // ---------------------------------------------------------------------------- @@ -533,7 +540,6 @@ android_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz, return UNKNOWN_ERROR; } - Parcel *request = parcelForJavaObject(env, java_request); Parcel *reply = parcelForJavaObject(env, java_reply); |