summaryrefslogtreecommitdiffstats
path: root/media/jni
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2012-05-11 16:45:19 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-05-11 16:45:19 -0700
commit909c4b855a372dbc70ce6777df64d12ae93ad2d5 (patch)
tree1a3987f0985b841177a7c24ee3a0f94cb418b0d3 /media/jni
parent7fc4fbccd6129e286a1f9c640eb3229b91792bce (diff)
parent8902097bb686752ff207e3bda12713be1a8c74eb (diff)
downloadframeworks_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.cpp22
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);