在安卓系统中运行,主要会碰到四种异常,造成应用崩溃退出
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层的异常捕获类所抓住(但是不是在信号处理函数中抛的,是可以被抓住并处理的).
波斯汪
相关分类