summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Amy Zhang <amyjojo@google.com> 2021-02-23 13:08:45 -0800
committer Amy Zhang <amyjojo@google.com> 2021-02-23 13:08:45 -0800
commit1c7a30afa09d07c36619b18f1aa45d8b081563d4 (patch)
tree8e3f32bb6af40ad28a49e7cb18136d984403bafb
parent03079387da09c1588d84015b6955e484dccfe69b (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.cpp20
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());
}