[Q&A] 通信が終わった後、アクティビティーを終了させるとアプリが落ちます。

642 views
Skip to first unread message

sangj...@e-inv.co.jp

unread,
Oct 13, 2016, 6:24:06 AM10/13/16
to SkyWay Technical Forum
SkyWay開発チーム様
大変お世話になっております。
一点、お聞きした点がございます。

【発生事象】
 AndroidとbrowserでPeerToPeerの接続はでき、やりとりはできますが、Android側で接続を切りながらアクティビティーを終了させると
 アプリが落ちてしまいます・・
 Destroyする際はサンプルのようにしております。
 @Override
    protected void onDestroy() {
        destroyPeer();

        _listPeerIds = null;
        _handler = null;
        super.onDestroy();
    }

【環境】
(例:
 ・クライアント種別+バージョン: Android Nexus7 2013, Firefox49.0.1
 ・OS: Android 6.0, Firefox 49.0.1
 ・ネットワーク : 社内NW(プロキシ無) 
 ・その他: Sampleコード(javascirpt,html, android)をもうちょっとカスタマイズ(WebSocketなど)してやっている
 

【期待される事象】
 アプリが落ちずにアクティビティーが正常に終了すること

【その他】

10-13 18:56:03.746 31700-31821/test.project.one I/System.out: {event=out_join, join_id=60BCE203-261D-4450-9555-F5F014A86C9A}
10-13 18:56:03.757 31700-31928/test.project.one I/org.webrtc.Logging: VideoCapturerAndroid: stopCapture
10-13 18:56:03.758 31700-31941/test.project.one I/org.webrtc.Logging: VideoCapturerAndroid: stopCaptureOnCameraThread
10-13 18:56:03.758 31700-31941/test.project.one I/org.webrtc.Logging: VideoCapturerAndroid: Stop preview.
10-13 18:56:04.056 31700-31941/test.project.one I/org.webrtc.Logging: VideoCapturerAndroid: Release camera.
10-13 18:56:04.056 31700-31712/test.project.one W/Camera-JNI: callback on dead camera object
10-13 18:56:04.622 31700-31928/test.project.one I/org.webrtc.Logging: VideoCapturerAndroid: stopCapture done
10-13 18:56:04.629 31700-31927/test.project.one I/org.webrtc.Logging: VideoCapturerAndroid: release
10-13 18:56:04.639 31700-31700/test.project.one I/org.webrtc.Logging: VideoCapturerAndroid: release
10-13 18:56:04.692 31700-32300/test.project.one W/art: Native thread exiting without having called DetachCurrentThread (maybe it's going to use a pthread_key_create destructor?): Thread[53,tid=32300,Native,Thread*=0x970dc800,peer=0x133550a0,"IncomingVideoSt - 32300"]
10-13 18:56:04.726 31700-31929/test.project.one W/art: Native thread exiting without having called DetachCurrentThread (maybe it's going to use a pthread_key_create destructor?): Thread[41,tid=31929,Native,Thread*=0x9d890400,peer=0x12fc80a0,"signaling_threa - 31929"]
10-13 18:56:04.728 31700-31928/test.project.one W/art: Native thread exiting without having called DetachCurrentThread (maybe it's going to use a pthread_key_create destructor?): Thread[40,tid=31928,Native,Thread*=0x9a954700,peer=0x12fa20a0,"Thread-2793"]
10-13 18:56:04.729 31700-31928/test.project.one A/art: art/runtime/thread.cc:1237] Native thread exited without calling DetachCurrentThread: Thread[40,tid=31928,Native,Thread*=0x9a954700,peer=0x12fa20a0,"Thread-2793"]
10-13 18:56:04.777 31700-31928/test.project.one A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x9c in tid 31928 (Thread-2793)
10-13 18:56:06.743 31700-32266/test.project.one W/OpenSLESPlayer: Bad OpenSL ES playout timing, dT=1872 [ms]

お手数をおかけいたしますが、
何か解決できる方法などがございましたら教えていただければ幸いです。
ご確認のほど、よろしくおねがいいたします。


Message has been deleted

sangj...@e-inv.co.jp

unread,
Oct 13, 2016, 8:18:33 AM10/13/16
to SkyWay Technical Forum
追記です。
純粋なサンプルコードでもhangoutボタンをタッチせずにアクティビティーを終了させたところ、
アプリが落ちる現象がありました。

Process: io.skyway.skw_sample, PID: 18629
java.lang.RuntimeException: Unable to destroy activity {io.skyway.skw_sample/io.skyway.testpeerjava.MediaActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.skyway.Peer.Browser.MediaStream.close()' on a null object reference
   at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3831)
   at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3849)
   at android.app.ActivityThread.-wrap5(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:5417)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void io.skyway.Peer.Browser.MediaStream.close()' on a null object reference
   at io.skyway.testpeerjava.MediaActivity.destroyPeer(MediaActivity.java:558)
   at io.skyway.testpeerjava.MediaActivity.onDestroy(MediaActivity.java:650)
   at android.app.Activity.performDestroy(Activity.java:6422)
   at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1142)
   at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3818)
   at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3849) 
   at android.app.ActivityThread.-wrap5(ActivityThread.java) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:148) 
   at android.app.ActivityThread.main(ActivityThread.java:5417) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

※ Hangupボタンをタッチしてからアクティビティーを終了させると落ちない
※ onStopでclosing関数を追加してHangupボタンをタッチせずにアクティビティーを終了させると落ちない
上記のケースも含めて見ていただければ幸いです。

よろしくおねがいいたします。

2016年10月13日木曜日 19時24分06秒 UTC+9 sangj...@e-inv.co.jp:

Tsuyoshi Takahashi

unread,
Oct 17, 2016, 10:37:55 PM10/17/16
to SkyWay Technical Forum
SkyWay開発チームの高橋です。
ご申告ありがとうございます。ご不便をおかけしております。

当方でご提供しているサンプルアプリで、ご指摘頂いた事象が再現する事が確認できました。
原因としては、MediaConnectionのclose()の完了時の非同期コールバックon(MediaEventEnum.CLOSE)内に記述した処理(_msRemote = null)が、destroyPeer()内の処理(_msRemote.close())の直前に実行される事により、同オブジェクトのNullPointerExceptionが発生していました。

回避策としては、ご申告頂いたようにonStop()でclosing()を実施頂く方法も考えられますが、よりNullPointerExceptionの回避可能性を高める為に、下記のように、_msRemote.close()の直前に_msRemoteのnullチェックを入れて頂く事が考えられます。

---
■ 修正前
private void destroyPeer(){
    closing(); 
    if (null != _msRemote){
        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.removeSrc(_msRemote, 0);
        _msRemote.close(); ★ 例外が発生
        _msRemote = null;
    }<以下略>
}

■ 修正例
private void destroyPeer(){
    closing(); 
    if (null != _msRemote){
        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.removeSrc(_msRemote, 0);
  if (null != _msRemote){ ★ nullチェックを直前に追加
          _msRemote.close();
          _msRemote = null;
  }
    }<以下略>
}
---

宜しくお願い致します。

sangj...@e-inv.co.jp

unread,
Oct 18, 2016, 12:57:35 AM10/18/16
to SkyWay Technical Forum
SkyWay開発チームの高橋様
お疲れ様です。

私も下記のような処理で回避するようにしておりました。
同じロジックでホッとしました。

回答いただき、ありがとうございました。
これからもよろしくお願いいたします。


2016年10月18日火曜日 11時37分55秒 UTC+9 Tsuyoshi Takahashi:
Reply all
Reply to author
Forward
0 new messages