diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 5db672993df18..5daf8b0f88f85 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -171,6 +171,12 @@ static int IP_V6_LENGTH = 16; void DestroyCallback(const C2Buffer * /* buf */, void *arg) { android::sp event = (android::MediaEvent *)arg; + if (event->mLinearBlockObj != NULL) { + JNIEnv *env = android::AndroidRuntime::getJNIEnv(); + env->DeleteWeakGlobalRef(event->mLinearBlockObj); + event->mLinearBlockObj = NULL; + } + event->mAvHandleRefCnt--; event->finalize(); } @@ -182,6 +188,12 @@ LnbCallback::LnbCallback(jobject lnbObj, LnbId id) : mId(id) { mLnb = env->NewWeakGlobalRef(lnbObj); } +LnbCallback::~LnbCallback() { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + env->DeleteWeakGlobalRef(mLnb); + mLnb = NULL; +} + Return LnbCallback::onEvent(LnbEventType lnbEventType) { ALOGD("LnbCallback::onEvent, type=%d", lnbEventType); JNIEnv *env = AndroidRuntime::getJNIEnv(); @@ -305,6 +317,7 @@ MediaEvent::MediaEvent(sp iFilter, hidl_handle avHandle, JNIEnv *env = AndroidRuntime::getJNIEnv(); mMediaEventObj = env->NewWeakGlobalRef(obj); mAvHandle = native_handle_clone(avHandle.getNativeHandle()); + mLinearBlockObj = NULL; } MediaEvent::~MediaEvent() { @@ -367,7 +380,7 @@ jobject MediaEvent::getLinearBlock() { true); mLinearBlockObj = env->NewWeakGlobalRef(linearBlock); mAvHandleRefCnt++; - return mLinearBlockObj; + return linearBlock; } else { native_handle_close(const_cast( reinterpret_cast(mIonHandle))); diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index fd29959174750..c4deeaf887bbd 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -73,6 +73,7 @@ namespace android { struct LnbCallback : public ILnbCallback { LnbCallback(jweak tunerObj, LnbId id); + ~LnbCallback(); virtual Return onEvent(LnbEventType lnbEventType); virtual Return onDiseqcMessage(const hidl_vec& diseqcMessage); jweak mLnb;