Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5303b542 authored by Lucas Gomez Jimenez's avatar Lucas Gomez Jimenez Committed by Steve Kondik
Browse files

DO NOT MERGE Fix JNI global references leak in AudioEffect

Added deletion of global references in native AudioEffect
implementation to avoid reaching maximum number of global references.

Issue can be reproduced with the following code snippet:

AudioTrack track = new AudioTrack(...);
BassBoost effect;
while(true) {
    effect = new BassBoost(0, track.getAudioSessionId());
    effect.release();
    effect = null;
}

Crash will happen after a few seconds when system runs out of
global references.

Change-Id: I3343967aae60784e61279e26151a28d01457c78b
parent af6d9b98
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -416,6 +416,9 @@ setup_failure:
    env->SetLongField(thiz, fields.fidNativeAudioEffect, 0);

    if (lpJniStorage) {
        // delete global refs created in native_setup
        env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class);
        env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref);
        delete lpJniStorage;
    }
    env->SetLongField(thiz, fields.fidJniData, 0);
@@ -448,6 +451,9 @@ static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz
    AudioEffectJniStorage* lpJniStorage = (AudioEffectJniStorage *)env->GetLongField(
        thiz, fields.fidJniData);
    if (lpJniStorage) {
        // delete global refs created in native_setup
        env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class);
        env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref);
        ALOGV("deleting pJniStorage: %p\n", lpJniStorage);
        delete lpJniStorage;
    }