前言在安卓系統中運行,主要會碰到四種異常,造成應用崩潰退出runtimeException.ANR.自己寫的JNI類和C代碼產生的信號異常.第三方so包造成的Native信號異常.因為我們公司的應用要求絕對不能發生崩潰退出的現象,所以我著手處理這四種異常,前三者都很容易處理(可以通過繼承UncaughtExceptionHandler ;或者通過收聽系統ANR廣播;或者自己寫C中模仿java中的try-cache功能捕獲信號異常并處理),就第四種比較棘手.捕獲native異常需要做兩步工作在c底層捕獲到native信號收到native信號之后,在c層的信號處理函數,通過反射,調用java中的方法;在c底層捕獲到native信號也很簡單,使用signal注冊即可,收到native信號之后,就直接走到信號處理函數中了.最麻煩的是第二步,如何反射回去.目前碰到的問題目前的問題是,如何收到native信號之后,在c語言的信號處理函數中,通過反射調用Java中的方法.普通的c層通過反射調用java層的方法也是沒有問題的,但是目前的問題是,在信號處理函數中,無法調用,或者是沒有效果,因為當捕獲到信號的時候,原來的進程馬上就要關閉了.我目前的試過的方法有在信號處理函數中,調用原Activity的方法,不好用在信號處理函數中,調用另一個進程的Activity的方法(在清單文件中配置process),不好用.在信號處理函數中,拋出異常,拋不出去.在信號處理函數中,拋出異常(提前取消默認的關閉操作),可以拋出,但是不會被java層的異常捕獲類所抓住(但是不是在信號處理函數中拋的,是可以被抓住并處理的).
安卓中如何捕獲native信號異常,在c底層通過反射調用即將結束的Activity里的方法
慕田峪9158850
2019-03-21 21:15:51