diff options
| author | 2021-02-23 13:08:45 -0800 | |
|---|---|---|
| committer | 2021-02-23 13:08:45 -0800 | |
| commit | 1c7a30afa09d07c36619b18f1aa45d8b081563d4 (patch) | |
| tree | 8e3f32bb6af40ad28a49e7cb18136d984403bafb | |
| parent | 03079387da09c1588d84015b6955e484dccfe69b (diff) | |
Remove unnecessary Tuner weak ref and enhance the Tuner weak ref on
frontend init
Test: atest android.media.tv.tuner.cts
Bug: 176190716
Change-Id: Ie37898e4490861fff326b964f1ba120b4458453c
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 1459a6b46b2b..177b00a573c3 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1237,15 +1237,23 @@ jobject JTuner::openFrontendByHandle(int feHandle) { if (mDemuxClient != NULL) { mDemuxClient->setFrontendDataSource(mFeClient); } - sp<FrontendClientCallbackImpl> feClientCb = new FrontendClientCallbackImpl(mObject); - mFeClient->setCallback(feClientCb); JNIEnv *env = AndroidRuntime::getJNIEnv(); + jobject tuner(env->NewLocalRef(mObject)); + if (env->IsSameObject(tuner, nullptr)) { + ALOGE("openFrontendByHandle" + "Tuner object has been freed. Failed to open frontend."); + env->DeleteWeakGlobalRef(mObject); + return NULL; + } + + sp<FrontendClientCallbackImpl> feClientCb = new FrontendClientCallbackImpl(mObject); + mFeClient->setCallback(feClientCb); // TODO: add more fields to frontend return env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Frontend"), gFields.frontendInitID, - mObject, + tuner, (jint) mFeId); } @@ -1793,16 +1801,14 @@ jobject JTuner::openDvr(DvrType type, jlong bufferSize) { dvrObj = env->NewObject( env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"), - gFields.dvrRecorderInitID, - mObject); + gFields.dvrRecorderInitID); dvrClient->incStrong(dvrObj); env->SetLongField(dvrObj, gFields.dvrRecorderContext, (jlong)dvrClient.get()); } else { dvrObj = env->NewObject( env->FindClass("android/media/tv/tuner/dvr/DvrPlayback"), - gFields.dvrPlaybackInitID, - mObject); + gFields.dvrPlaybackInitID); dvrClient->incStrong(dvrObj); env->SetLongField(dvrObj, gFields.dvrPlaybackContext, (jlong)dvrClient.get()); } |