为了账号安全,请及时绑定邮箱和手机立即绑定

安卓中如何捕获native信号异常,在c底层通过反射调用即将结束的Activity里的方法

安卓中如何捕获native信号异常,在c底层通过反射调用即将结束的Activity里的方法

慕田峪9158850 2019-03-21 21:15:51
前言在安卓系统中运行,主要会碰到四种异常,造成应用崩溃退出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层的异常捕获类所抓住(但是不是在信号处理函数中抛的,是可以被抓住并处理的).
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

(env)->CallVoidMethod(env, obj, methodID, (env)->NewStringUTF(env, "你好世界"));在错误发生之前是可以回调到的,但是异常发生后就回调不到了


查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 698 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信