Call DeleteLocalRef on callObjectMethod's returned value

CallObjectMethod returns a local reference that's causing memory
leakage. We need to make sure all these local refs are deleted.

Bug: 214967397
Test: manual
Change-Id: I7462bd9293b214d75df5196ae42b4da1da904e1a
This commit is contained in:
Yu-Han Yang
2022-01-30 10:45:56 -08:00
parent db5c3e9127
commit cc3710bec5
4 changed files with 62 additions and 47 deletions

View File

@@ -226,17 +226,18 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
env->NewObject(class_gnssAntennaInfoBuilder, method_gnssAntennaInfoBuilderCtor);
// Set fields
env->CallObjectMethod(gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz,
gnssAntennaInfo.carrierFrequencyMHz);
env->CallObjectMethod(gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetPhaseCenterOffset, phaseCenterOffset);
env->CallObjectMethod(gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetPhaseCenterVariationCorrections,
phaseCenterVariationCorrections);
env->CallObjectMethod(gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetSignalGainCorrections,
signalGainCorrections);
callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz,
gnssAntennaInfo.carrierFrequencyMHz);
callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetPhaseCenterOffset,
phaseCenterOffset);
callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetPhaseCenterVariationCorrections,
phaseCenterVariationCorrections);
callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetSignalGainCorrections,
signalGainCorrections);
// build
jobject gnssAntennaInfoObject =

View File

@@ -212,13 +212,14 @@ void setMeasurementData(JNIEnv* env, jobject& callbacksObj, jobject clock,
jobject gnssMeasurementsEventBuilderObject =
env->NewObject(class_gnssMeasurementsEventBuilder,
method_gnssMeasurementsEventBuilderCtor);
env->CallObjectMethod(gnssMeasurementsEventBuilderObject,
method_gnssMeasurementsEventBuilderSetClock, clock);
env->CallObjectMethod(gnssMeasurementsEventBuilderObject,
method_gnssMeasurementsEventBuilderSetMeasurements, measurementArray);
env->CallObjectMethod(gnssMeasurementsEventBuilderObject,
method_gnssMeasurementsEventBuilderSetGnssAutomaticGainControls,
gnssAgcArray);
callObjectMethodIgnoringResult(env, gnssMeasurementsEventBuilderObject,
method_gnssMeasurementsEventBuilderSetClock, clock);
callObjectMethodIgnoringResult(env, gnssMeasurementsEventBuilderObject,
method_gnssMeasurementsEventBuilderSetMeasurements,
measurementArray);
callObjectMethodIgnoringResult(env, gnssMeasurementsEventBuilderObject,
method_gnssMeasurementsEventBuilderSetGnssAutomaticGainControls,
gnssAgcArray);
jobject gnssMeasurementsEventObject =
env->CallObjectMethod(gnssMeasurementsEventBuilderObject,
method_gnssMeasurementsEventBuilderBuild);
@@ -408,24 +409,24 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env,
satellitePvt.satClockInfo.satHardwareCodeBiasMeters,
satellitePvt.satClockInfo.satTimeCorrectionMeters,
satellitePvt.satClockInfo.satClkDriftMps);
env->CallObjectMethod(satellitePvtBuilderObject,
method_satellitePvtBuilderSetPositionEcef, positionEcef);
env->CallObjectMethod(satellitePvtBuilderObject,
method_satellitePvtBuilderSetVelocityEcef, velocityEcef);
env->CallObjectMethod(satellitePvtBuilderObject, method_satellitePvtBuilderSetClockInfo,
clockInfo);
callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
method_satellitePvtBuilderSetPositionEcef, positionEcef);
callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
method_satellitePvtBuilderSetVelocityEcef, velocityEcef);
callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
method_satellitePvtBuilderSetClockInfo, clockInfo);
}
if (satFlags & SatellitePvt::HAS_IONO) {
env->CallObjectMethod(satellitePvtBuilderObject,
method_satellitePvtBuilderSetIonoDelayMeters,
satellitePvt.ionoDelayMeters);
callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
method_satellitePvtBuilderSetIonoDelayMeters,
satellitePvt.ionoDelayMeters);
}
if (satFlags & SatellitePvt::HAS_TROPO) {
env->CallObjectMethod(satellitePvtBuilderObject,
method_satellitePvtBuilderSetTropoDelayMeters,
satellitePvt.tropoDelayMeters);
callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
method_satellitePvtBuilderSetTropoDelayMeters,
satellitePvt.tropoDelayMeters);
}
jobject satellitePvtObject =
@@ -453,17 +454,19 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env,
jobject correlationVectorBuilderObject =
env->NewObject(class_correlationVectorBuilder,
method_correlationVectorBuilderCtor);
env->CallObjectMethod(correlationVectorBuilderObject,
method_correlationVectorBuilderSetMagnitude, magnitudeArray);
env->CallObjectMethod(correlationVectorBuilderObject,
method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond,
correlationVector.frequencyOffsetMps);
env->CallObjectMethod(correlationVectorBuilderObject,
method_correlationVectorBuilderSetSamplingStartMeters,
correlationVector.samplingStartM);
env->CallObjectMethod(correlationVectorBuilderObject,
method_correlationVectorBuilderSetSamplingWidthMeters,
correlationVector.samplingWidthM);
callObjectMethodIgnoringResult(env, correlationVectorBuilderObject,
method_correlationVectorBuilderSetMagnitude,
magnitudeArray);
callObjectMethodIgnoringResult(
env, correlationVectorBuilderObject,
method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond,
correlationVector.frequencyOffsetMps);
callObjectMethodIgnoringResult(env, correlationVectorBuilderObject,
method_correlationVectorBuilderSetSamplingStartMeters,
correlationVector.samplingStartM);
callObjectMethodIgnoringResult(env, correlationVectorBuilderObject,
method_correlationVectorBuilderSetSamplingWidthMeters,
correlationVector.samplingWidthM);
jobject correlationVectorObject =
env->CallObjectMethod(correlationVectorBuilderObject,
method_correlationVectorBuilderBuild);
@@ -519,12 +522,14 @@ jobjectArray GnssMeasurementCallbackAidl::translateAllGnssAgcs(JNIEnv* env,
const GnssAgc& gnssAgc = agcs[i];
jobject agcBuilderObject = env->NewObject(class_gnssAgcBuilder, method_gnssAgcBuilderCtor);
env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderSetLevelDb,
gnssAgc.agcLevelDb);
env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderSetConstellationType,
(int)gnssAgc.constellation);
env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderSetCarrierFrequencyHz,
gnssAgc.carrierFrequencyHz);
callObjectMethodIgnoringResult(env, agcBuilderObject, method_gnssAgcBuilderSetLevelDb,
gnssAgc.agcLevelDb);
callObjectMethodIgnoringResult(env, agcBuilderObject,
method_gnssAgcBuilderSetConstellationType,
(int)gnssAgc.constellation);
callObjectMethodIgnoringResult(env, agcBuilderObject,
method_gnssAgcBuilderSetCarrierFrequencyHz,
gnssAgc.carrierFrequencyHz);
jobject agcObject = env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderBuild);
env->SetObjectArrayElement(gnssAgcArray, i, agcObject);

View File

@@ -111,6 +111,13 @@ void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
}
}
void callObjectMethodIgnoringResult(JNIEnv* env, jobject obj, jmethodID mid, ...) {
va_list args;
va_start(args, mid);
env->DeleteLocalRef(env->CallObjectMethodV(obj, mid, args));
va_end(args);
}
JavaObject::JavaObject(JNIEnv* env, jclass clazz, jmethodID defaultCtor)
: env_(env), clazz_(clazz) {
object_ = env_->NewObject(clazz_, defaultCtor);

View File

@@ -56,6 +56,8 @@ jboolean checkAidlStatus(const android::binder::Status& status, const char* erro
void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName);
void callObjectMethodIgnoringResult(JNIEnv* env, jobject obj, jmethodID mid, ...);
template <class T>
void logHidlError(hardware::Return<T>& result, const char* errorMessage) {
ALOGE("%s HIDL transport error: %s", errorMessage, result.description().c_str());