Changeset 5357


Ignore:
Timestamp:
Jun 27, 2016 11:09:01 AM (8 years ago)
Author:
riza
Message:

Fixed #1939: Fixed crash when failed to initialize android jni dev (AudioRecord?).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-audiodev/android_jni_dev.c

    r5248 r5357  
    6060    pjmedia_dir         dir; 
    6161    pjmedia_aud_param   param; 
    62      
     62 
    6363    int                 bytes_per_sample; 
    6464    pj_uint32_t         samples_per_sec; 
     
    7777    pj_thread_t        *rec_thread; 
    7878    pj_sem_t           *rec_sem; 
    79     pj_timestamp        rec_timestamp; 
    80      
     79    pj_timestamp        rec_timestamp;     
     80 
    8181    /* Track */ 
    8282    jobject             track; 
     
    8787    pj_thread_t        *play_thread; 
    8888    pj_sem_t           *play_sem; 
    89     pj_timestamp        play_timestamp; 
     89    pj_timestamp        play_timestamp; 
    9090}; 
    9191 
     
    664664    if (stream->dir & PJMEDIA_DIR_CAPTURE) { 
    665665        jthrowable exc; 
     666        jobject record_obj; 
    666667        int mic_source = 0; /* DEFAULT: default audio source */ 
    667668 
     
    695696         
    696697        do { 
    697             stream->record =  (*jni_env)->NewObject(jni_env, 
    698                                                     stream->record_class, 
    699                                                     constructor_method, 
    700                                                     mic_source,  
    701                                                     param->clock_rate, 
    702                                                     channelInCfg, 
    703                                                     sampleFormat, 
    704                                                     inputBuffSizeRec); 
    705             if (stream->record == 0) { 
     698            record_obj =  (*jni_env)->NewObject(jni_env, 
     699                                                stream->record_class, 
     700                                                constructor_method, 
     701                                                mic_source,  
     702                                                param->clock_rate, 
     703                                                channelInCfg, 
     704                                                sampleFormat, 
     705                                                inputBuffSizeRec); 
     706            if (record_obj == 0) { 
    706707                PJ_LOG(3, (THIS_FILE, "Unable to create audio record object")); 
    707708                status = PJMEDIA_EAUD_INIT; 
     
    732733                goto on_error; 
    733734            } 
    734             state = (*jni_env)->CallIntMethod(jni_env, stream->record, 
    735                                               method_id); 
     735            state = (*jni_env)->CallIntMethod(jni_env, record_obj, method_id); 
    736736            if (state == 0) { /* STATE_UNINITIALIZED */ 
    737737                PJ_LOG(3, (THIS_FILE, "Failure in initializing audio record.")); 
     
    745745        } while (state == 0); 
    746746         
    747         stream->record = (*jni_env)->NewGlobalRef(jni_env, stream->record); 
     747        stream->record = (*jni_env)->NewGlobalRef(jni_env, record_obj); 
    748748        if (stream->record == 0) { 
    749             PJ_LOG(3, (THIS_FILE, "Unable to create audio record global ref.")); 
     749            jmethodID release_method=0; 
     750             
     751            PJ_LOG(3, (THIS_FILE, "Unable to create audio record global ref."));             
     752            release_method = (*jni_env)->GetMethodID(jni_env,  
     753                                                     stream->record_class, 
     754                                                     "release", "()V"); 
     755            (*jni_env)->CallVoidMethod(jni_env, record_obj, release_method); 
     756             
    750757            status = PJMEDIA_EAUD_INIT; 
    751758            goto on_error; 
     
    767774    if (stream->dir & PJMEDIA_DIR_PLAYBACK) { 
    768775        jthrowable exc; 
     776        jobject track_obj; 
    769777         
    770778        /* Get pointer to the constructor */ 
     
    778786        } 
    779787         
    780         stream->track = (*jni_env)->NewObject(jni_env, 
    781                                               stream->track_class, 
    782                                               constructor_method, 
    783                                               0, /* STREAM_VOICE_CALL */ 
    784                                               param->clock_rate, 
    785                                               channelOutCfg, 
    786                                               sampleFormat, 
    787                                               inputBuffSizePlay, 
    788                                               1 /* MODE_STREAM */); 
    789         if (stream->track == 0) { 
     788        track_obj = (*jni_env)->NewObject(jni_env, 
     789                                          stream->track_class, 
     790                                          constructor_method, 
     791                                          0, /* STREAM_VOICE_CALL */ 
     792                                          param->clock_rate, 
     793                                          channelOutCfg, 
     794                                          sampleFormat, 
     795                                          inputBuffSizePlay, 
     796                                          1 /* MODE_STREAM */); 
     797        if (track_obj == 0) { 
    790798            PJ_LOG(3, (THIS_FILE, "Unable to create audio track object.")); 
    791799            status = PJMEDIA_EAUD_INIT; 
     
    802810        } 
    803811         
    804         stream->track = (*jni_env)->NewGlobalRef(jni_env, stream->track); 
     812        stream->track = (*jni_env)->NewGlobalRef(jni_env, track_obj); 
    805813        if (stream->track == 0) { 
     814            jmethodID release_method=0; 
     815                 
     816            release_method = (*jni_env)->GetMethodID(jni_env,  
     817                                                     stream->track_class, 
     818                                                     "release", "()V"); 
     819            (*jni_env)->CallVoidMethod(jni_env, track_obj, release_method); 
     820             
    806821            PJ_LOG(3, (THIS_FILE, "Unable to create audio track's global ref")); 
    807822            status = PJMEDIA_EAUD_INIT; 
     
    973988     
    974989    PJ_LOG(4,(THIS_FILE, "Destroying Android JNI stream...")); 
    975      
     990 
    976991    stream->quit_flag = PJ_TRUE; 
    977992     
     
    980995     
    981996    attached = attach_jvm(&jni_env); 
    982      
     997 
    983998    if (stream->record){ 
    984999        if (stream->rec_thread) { 
     
    9931008            stream->rec_sem = NULL; 
    9941009        } 
    995          
    996         release_method = (*jni_env)->GetMethodID(jni_env, stream->record_class, 
    997                                                  "release", "()V"); 
    998         (*jni_env)->CallVoidMethod(jni_env, stream->record, release_method); 
    999          
     1010        if (stream->record_class) { 
     1011            release_method = (*jni_env)->GetMethodID(jni_env,  
     1012                                                     stream->record_class, 
     1013                                                     "release", "()V"); 
     1014            (*jni_env)->CallVoidMethod(jni_env, stream->record, 
     1015                                       release_method); 
     1016        } 
    10001017        (*jni_env)->DeleteGlobalRef(jni_env, stream->record); 
    1001         (*jni_env)->DeleteGlobalRef(jni_env, stream->record_class); 
    10021018        stream->record = NULL; 
    1003         stream->record_class = NULL; 
    10041019        PJ_LOG(4, (THIS_FILE, "Audio record released")); 
     1020    } 
     1021    if (stream->record_class) { 
     1022        (*jni_env)->DeleteGlobalRef(jni_env, stream->record_class); 
     1023        stream->record_class = NULL; 
    10051024    } 
    10061025     
     
    10171036            stream->play_sem = NULL; 
    10181037        } 
    1019          
    1020         release_method = (*jni_env)->GetMethodID(jni_env, stream->track_class, 
    1021                                                  "release", "()V"); 
    1022         (*jni_env)->CallVoidMethod(jni_env, stream->track, release_method); 
    1023          
     1038        if (stream->track_class) { 
     1039            release_method = (*jni_env)->GetMethodID(jni_env,  
     1040                                                     stream->track_class, 
     1041                                                     "release", "()V"); 
     1042            (*jni_env)->CallVoidMethod(jni_env, stream->track,  
     1043                                       release_method); 
     1044        } 
    10241045        (*jni_env)->DeleteGlobalRef(jni_env, stream->track); 
    1025         (*jni_env)->DeleteGlobalRef(jni_env, stream->track_class); 
    1026         stream->track = NULL; 
    1027         stream->track_class = NULL; 
    1028         PJ_LOG(3, (THIS_FILE, "Audio track released")); 
     1046        stream->track = NULL;         
     1047        PJ_LOG(4, (THIS_FILE, "Audio track released")); 
     1048    } 
     1049    if (stream->track_class) { 
     1050        (*jni_env)->DeleteGlobalRef(jni_env, stream->track_class); 
     1051        stream->track_class = NULL; 
    10291052    } 
    10301053 
Note: See TracChangeset for help on using the changeset viewer.