// try to force GC to do its job before destroying the library, since it's // recommended to do that by PJSUA examples Runtime.getRuntime().gc(); Thread.sleep(100); mit freundlichen Grüßen | kind regards Michael Barthold Senior Software Architect -----Ursprüngliche Nachricht----- Von: pjsip [mailto:pjsip-bounces@xxxxxxxxxxxxxxx] Im Auftrag von frogersik Gesendet: Dienstag, 7. Februar 2017 10:49 An: pjsip list <pjsip@xxxxxxxxxxxxxxx> Betreff: [android] destroy endpoint on call -crash GC Hi, Sorry for long post, but it cannot be shorter. I have huge problem with deinit endpoint during call. I'm using latest version of pjsip (2.6) build stack with ndk 11. When I call Endpoint.delete() or Endpoint.libDestroy() I get crash from lib. My problem is connected with gc (http://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#problems-with-garbage-collection)\ Do you know what kind of objects I need to delete before I want to deinitialize lib? I want to do that when I lost connection, when I go out from WiFi or other user interaction with WiFi. In these case I get two kinds of error: 1. "conf && port < conf->max_ports" failed (log in attachment) 2. "Calling pjlib from unknown/external thread." (log in attachment) I also attach full log when I disconnect WiFi during call. As you can see. I try disconnect audio ports but it doesn't help. BR, Andrzej Here is my deinit procedure: void deInitialize(final SipService sipService) { Log.d(this, "deInitialize deleteAudioMedia();"); deleteAudioMedia(); Log.d(this, "deInitialize deleteCall();"); deleteCall(sipService); Log.d(this, "deInitialize deleteAccount();"); deleteAccount(); try { IntVector transportVector = ep.transportEnum(); for (int i = 0; i < transportVector.size(); i++) { Log.d(this, "deInitialize transportClose();"); ep.transportClose(i); } } catch (Exception e) { Log.e(this, e); } Log.d(this, "deInitialize sipTpConfig.delete();"); sipTpConfig.delete(); sipTpConfig = null; try { Thread.sleep(3000); Log.d(this, "deInitialize ep.libDestroy();"); ep.libDestroy(); } catch (Exception e) { Log.e(this, e); } Log.d(this, "deInitialize ep.delete();"); ep.delete(); ep = null; sipService.notifyStackState(pjsua_state.PJSUA_STATE_NULL); } void deleteCall(final SipService sipService) { try { ep.hangupAllCalls(); if (mSipAccount != null) { Stream.of(mSipAccount.getCallIDs()).filter(callId -> callId != -1).forEach(callId -> { SipCall call = mSipAccount.getCall(callId); if (call != null) { call.delete(); call = null; } sipService.notifyCallDisconnected(callId); }); } } catch (Exception e) { Log.d(this, "deleteCall", e); } } void deleteAudioMedia() { try { AudioMediaVector audioMediaVector = ep.mediaEnumPorts(); for (int i = 0; i < audioMediaVector.size(); i++) { Log.d(this, "audioMedia deleted"); AudioMedia audioMedia = audioMediaVector.get(i); ep.mediaRemove(audioMedia); audioMedia.delete(); } Log.d(this, "audDevManager deleted"); ep.audDevManager().delete(); } catch (Exception e) { Log.e(this, "deleteAudioMedia", e); } } void deleteAccount() { if (mSipAccount != null) { try { mSipAccount.delete(); } catch (final Exception e) { Log.e(this, e); } } mSipAccount = null; } where ep - Endpoint mSipAccount - public class SipAccount extends Account _______________________________________________ Visit our blog: http://blog.pjsip.org pjsip mailing list pjsip@xxxxxxxxxxxxxxx http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org