Merge "Check if the weak reference of java object is alive before using it" into sc-dev
This commit is contained in:
@@ -217,23 +217,36 @@ namespace android {
|
||||
void LnbClientCallbackImpl::onEvent(const LnbEventType lnbEventType) {
|
||||
ALOGD("LnbClientCallbackImpl::onEvent, type=%d", lnbEventType);
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
env->CallVoidMethod(
|
||||
mLnbObj,
|
||||
gFields.onLnbEventID,
|
||||
(jint)lnbEventType);
|
||||
jobject lnb(env->NewLocalRef(mLnbObj));
|
||||
if (!env->IsSameObject(lnb, nullptr)) {
|
||||
env->CallVoidMethod(
|
||||
lnb,
|
||||
gFields.onLnbEventID,
|
||||
(jint)lnbEventType);
|
||||
} else {
|
||||
ALOGE("LnbClientCallbackImpl::onEvent:"
|
||||
"Lnb object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mLnbObj);
|
||||
}
|
||||
}
|
||||
|
||||
void LnbClientCallbackImpl::onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage) {
|
||||
ALOGD("LnbClientCallbackImpl::onDiseqcMessage");
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
jbyteArray array = env->NewByteArray(diseqcMessage.size());
|
||||
env->SetByteArrayRegion(
|
||||
array, 0, diseqcMessage.size(), reinterpret_cast<jbyte*>(diseqcMessage[0]));
|
||||
|
||||
env->CallVoidMethod(
|
||||
mLnbObj,
|
||||
gFields.onLnbDiseqcMessageID,
|
||||
array);
|
||||
jobject lnb(env->NewLocalRef(mLnbObj));
|
||||
if (!env->IsSameObject(lnb, nullptr)) {
|
||||
jbyteArray array = env->NewByteArray(diseqcMessage.size());
|
||||
env->SetByteArrayRegion(
|
||||
array, 0, diseqcMessage.size(), reinterpret_cast<jbyte*>(diseqcMessage[0]));
|
||||
env->CallVoidMethod(
|
||||
lnb,
|
||||
gFields.onLnbDiseqcMessageID,
|
||||
array);
|
||||
} else {
|
||||
ALOGE("LnbClientCallbackImpl::onDiseqcMessage:"
|
||||
"Lnb object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mLnbObj);
|
||||
}
|
||||
}
|
||||
|
||||
void LnbClientCallbackImpl::setLnb(jweak lnbObj) {
|
||||
@@ -254,19 +267,33 @@ LnbClientCallbackImpl::~LnbClientCallbackImpl() {
|
||||
void DvrClientCallbackImpl::onRecordStatus(RecordStatus status) {
|
||||
ALOGD("DvrClientCallbackImpl::onRecordStatus");
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
env->CallVoidMethod(
|
||||
mDvrObj,
|
||||
gFields.onDvrRecordStatusID,
|
||||
(jint) status);
|
||||
jobject dvr(env->NewLocalRef(mDvrObj));
|
||||
if (!env->IsSameObject(dvr, nullptr)) {
|
||||
env->CallVoidMethod(
|
||||
dvr,
|
||||
gFields.onDvrRecordStatusID,
|
||||
(jint) status);
|
||||
} else {
|
||||
ALOGE("DvrClientCallbackImpl::onRecordStatus:"
|
||||
"Dvr object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mDvrObj);
|
||||
}
|
||||
}
|
||||
|
||||
void DvrClientCallbackImpl::onPlaybackStatus(PlaybackStatus status) {
|
||||
ALOGD("DvrClientCallbackImpl::onPlaybackStatus");
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
env->CallVoidMethod(
|
||||
mDvrObj,
|
||||
gFields.onDvrPlaybackStatusID,
|
||||
(jint) status);
|
||||
jobject dvr(env->NewLocalRef(mDvrObj));
|
||||
if (!env->IsSameObject(dvr, nullptr)) {
|
||||
env->CallVoidMethod(
|
||||
dvr,
|
||||
gFields.onDvrPlaybackStatusID,
|
||||
(jint) status);
|
||||
} else {
|
||||
ALOGE("DvrClientCallbackImpl::onPlaybackStatus:"
|
||||
"Dvr object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mDvrObj);
|
||||
}
|
||||
}
|
||||
|
||||
void DvrClientCallbackImpl::setDvr(jweak dvrObj) {
|
||||
@@ -810,10 +837,17 @@ void FilterClientCallbackImpl::onFilterEvent_1_1(const DemuxFilterEvent& filterE
|
||||
}
|
||||
}
|
||||
}
|
||||
env->CallVoidMethod(
|
||||
mFilterObj,
|
||||
gFields.onFilterEventID,
|
||||
array);
|
||||
jobject filter(env->NewLocalRef(mFilterObj));
|
||||
if (!env->IsSameObject(filter, nullptr)) {
|
||||
env->CallVoidMethod(
|
||||
filter,
|
||||
gFields.onFilterEventID,
|
||||
array);
|
||||
} else {
|
||||
ALOGE("FilterClientCallbackImpl::onFilterEvent_1_1:"
|
||||
"Filter object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mFilterObj);
|
||||
}
|
||||
}
|
||||
|
||||
void FilterClientCallbackImpl::onFilterEvent(const DemuxFilterEvent& filterEvent) {
|
||||
@@ -828,10 +862,17 @@ void FilterClientCallbackImpl::onFilterEvent(const DemuxFilterEvent& filterEvent
|
||||
void FilterClientCallbackImpl::onFilterStatus(const DemuxFilterStatus status) {
|
||||
ALOGD("FilterClientCallbackImpl::onFilterStatus");
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
env->CallVoidMethod(
|
||||
mFilterObj,
|
||||
gFields.onFilterStatusID,
|
||||
(jint)status);
|
||||
jobject filter(env->NewLocalRef(mFilterObj));
|
||||
if (!env->IsSameObject(filter, nullptr)) {
|
||||
env->CallVoidMethod(
|
||||
filter,
|
||||
gFields.onFilterStatusID,
|
||||
(jint)status);
|
||||
} else {
|
||||
ALOGE("FilterClientCallbackImpl::onFilterStatus:"
|
||||
"Filter object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mFilterObj);
|
||||
}
|
||||
}
|
||||
|
||||
void FilterClientCallbackImpl::setFilter(jweak filterObj, sp<FilterClient> filterClient) {
|
||||
@@ -841,6 +882,15 @@ void FilterClientCallbackImpl::setFilter(jweak filterObj, sp<FilterClient> filte
|
||||
mFilterClient = filterClient;
|
||||
}
|
||||
|
||||
FilterClientCallbackImpl::~FilterClientCallbackImpl() {
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
if (mFilterObj != NULL) {
|
||||
env->DeleteWeakGlobalRef(mFilterObj);
|
||||
mFilterObj = NULL;
|
||||
}
|
||||
mFilterClient = NULL;
|
||||
}
|
||||
|
||||
/////////////// FrontendClientCallbackImpl ///////////////////////
|
||||
|
||||
FrontendClientCallbackImpl::FrontendClientCallbackImpl(jweak tunerObj) : mObject(tunerObj) {}
|
||||
@@ -848,10 +898,17 @@ FrontendClientCallbackImpl::FrontendClientCallbackImpl(jweak tunerObj) : mObject
|
||||
void FrontendClientCallbackImpl::onEvent(FrontendEventType frontendEventType) {
|
||||
ALOGD("FrontendClientCallbackImpl::onEvent, type=%d", frontendEventType);
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
gFields.onFrontendEventID,
|
||||
(jint)frontendEventType);
|
||||
jobject frontend(env->NewLocalRef(mObject));
|
||||
if (!env->IsSameObject(frontend, nullptr)) {
|
||||
env->CallVoidMethod(
|
||||
frontend,
|
||||
gFields.onFrontendEventID,
|
||||
(jint)frontendEventType);
|
||||
} else {
|
||||
ALOGE("FrontendClientCallbackImpl::onEvent:"
|
||||
"Frontend object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mObject);
|
||||
}
|
||||
}
|
||||
|
||||
void FrontendClientCallbackImpl::onScanMessage(
|
||||
@@ -859,11 +916,18 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
ALOGD("FrontendClientCallbackImpl::onScanMessage, type=%d", type);
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
jclass clazz = env->FindClass("android/media/tv/tuner/Tuner");
|
||||
jobject frontend(env->NewLocalRef(mObject));
|
||||
if (env->IsSameObject(frontend, nullptr)) {
|
||||
ALOGE("FrontendClientCallbackImpl::onScanMessage:"
|
||||
"Frontend object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mObject);
|
||||
return;
|
||||
}
|
||||
switch(type) {
|
||||
case FrontendScanMessageType::LOCKED: {
|
||||
if (message.isLocked()) {
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onLocked", "()V"));
|
||||
}
|
||||
break;
|
||||
@@ -871,14 +935,14 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
case FrontendScanMessageType::END: {
|
||||
if (message.isEnd()) {
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onScanStopped", "()V"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FrontendScanMessageType::PROGRESS_PERCENT: {
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onProgress", "(I)V"),
|
||||
(jint) message.progressPercent());
|
||||
break;
|
||||
@@ -889,7 +953,7 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
env->SetIntArrayRegion(freqs, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
|
||||
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onFrequenciesReport", "([I)V"),
|
||||
freqs);
|
||||
break;
|
||||
@@ -900,21 +964,21 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
env->SetIntArrayRegion(symbolRates, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
|
||||
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onSymbolRates", "([I)V"),
|
||||
symbolRates);
|
||||
break;
|
||||
}
|
||||
case FrontendScanMessageType::HIERARCHY: {
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onHierarchy", "(I)V"),
|
||||
(jint) message.hierarchy());
|
||||
break;
|
||||
}
|
||||
case FrontendScanMessageType::ANALOG_TYPE: {
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onSignalType", "(I)V"),
|
||||
(jint) message.analogType());
|
||||
break;
|
||||
@@ -926,7 +990,7 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
env->SetIntArrayRegion(plpIds, 0, jintV.size(), &jintV[0]);
|
||||
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onPlpIds", "([I)V"),
|
||||
plpIds);
|
||||
break;
|
||||
@@ -938,7 +1002,7 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
env->SetIntArrayRegion(groupIds, 0, jintV.size(), &jintV[0]);
|
||||
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onGroupIds", "([I)V"),
|
||||
groupIds);
|
||||
break;
|
||||
@@ -950,7 +1014,7 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
env->SetIntArrayRegion(streamIds, 0, jintV.size(), &jintV[0]);
|
||||
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onInputStreamIds", "([I)V"),
|
||||
streamIds);
|
||||
break;
|
||||
@@ -961,21 +1025,21 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
|
||||
standard = (jint) std.sStd();
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onDvbsStandard", "(I)V"),
|
||||
standard);
|
||||
} else if (std.getDiscriminator() ==
|
||||
FrontendScanMessage::Standard::hidl_discriminator::tStd) {
|
||||
standard = (jint) std.tStd();
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onDvbtStandard", "(I)V"),
|
||||
standard);
|
||||
} else if (std.getDiscriminator() ==
|
||||
FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
|
||||
standard = (jint) std.sifStd();
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onAnalogSifStandard", "(I)V"),
|
||||
standard);
|
||||
}
|
||||
@@ -996,7 +1060,7 @@ void FrontendClientCallbackImpl::onScanMessage(
|
||||
env->SetObjectArrayElement(array, i, obj);
|
||||
}
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onAtsc3PlpInfos",
|
||||
"([Landroid/media/tv/tuner/frontend/Atsc3PlpInfo;)V"),
|
||||
array);
|
||||
@@ -1010,6 +1074,13 @@ void FrontendClientCallbackImpl::onScanMessageExt1_1(FrontendScanMessageTypeExt1
|
||||
ALOGD("FrontendClientCallbackImpl::onScanMessageExt1_1, type=%d", type);
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
jclass clazz = env->FindClass("android/media/tv/tuner/Tuner");
|
||||
jobject frontend(env->NewLocalRef(mObject));
|
||||
if (env->IsSameObject(frontend, nullptr)) {
|
||||
ALOGE("FrontendClientCallbackImpl::onScanMessageExt1_1:"
|
||||
"Frontend object has been freed. Ignoring callback.");
|
||||
env->DeleteWeakGlobalRef(mObject);
|
||||
return;
|
||||
}
|
||||
switch(type) {
|
||||
case FrontendScanMessageTypeExt1_1::MODULATION: {
|
||||
jint modulation = -1;
|
||||
@@ -1056,7 +1127,7 @@ void FrontendClientCallbackImpl::onScanMessageExt1_1(FrontendScanMessageTypeExt1
|
||||
}
|
||||
if (modulation > 0) {
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onModulationReported", "(I)V"),
|
||||
modulation);
|
||||
}
|
||||
@@ -1065,7 +1136,7 @@ void FrontendClientCallbackImpl::onScanMessageExt1_1(FrontendScanMessageTypeExt1
|
||||
case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
|
||||
bool isHighPriority = message.isHighPriority();
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onPriorityReported", "(B)V"),
|
||||
isHighPriority);
|
||||
break;
|
||||
@@ -1073,7 +1144,7 @@ void FrontendClientCallbackImpl::onScanMessageExt1_1(FrontendScanMessageTypeExt1
|
||||
case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
|
||||
jint dvbcAnnex = (jint) message.annex();
|
||||
env->CallVoidMethod(
|
||||
mObject,
|
||||
frontend,
|
||||
env->GetMethodID(clazz, "onDvbcAnnexReported", "(I)V"),
|
||||
dvbcAnnex);
|
||||
break;
|
||||
@@ -1083,6 +1154,14 @@ void FrontendClientCallbackImpl::onScanMessageExt1_1(FrontendScanMessageTypeExt1
|
||||
}
|
||||
}
|
||||
|
||||
FrontendClientCallbackImpl::~FrontendClientCallbackImpl() {
|
||||
JNIEnv *env = AndroidRuntime::getJNIEnv();
|
||||
if (mObject != NULL) {
|
||||
env->DeleteWeakGlobalRef(mObject);
|
||||
mObject = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/////////////// Tuner ///////////////////////
|
||||
|
||||
sp<TunerClient> JTuner::mTunerClient;
|
||||
|
||||
@@ -118,6 +118,7 @@ struct MediaEvent : public RefBase {
|
||||
};
|
||||
|
||||
struct FilterClientCallbackImpl : public FilterClientCallback {
|
||||
~FilterClientCallbackImpl();
|
||||
virtual void onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
|
||||
const DemuxFilterEventExt& filterEventExt);
|
||||
virtual void onFilterEvent(const DemuxFilterEvent& filterEvent);
|
||||
@@ -155,7 +156,7 @@ private:
|
||||
|
||||
struct FrontendClientCallbackImpl : public FrontendClientCallback {
|
||||
FrontendClientCallbackImpl(jweak tunerObj);
|
||||
|
||||
~FrontendClientCallbackImpl();
|
||||
virtual void onEvent(FrontendEventType frontendEventType);
|
||||
virtual void onScanMessage(
|
||||
FrontendScanMessageType type, const FrontendScanMessage& message);
|
||||
|
||||
Reference in New Issue
Block a user