猿问

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

前言

在安卓系统中运行,主要会碰到四种异常,造成应用崩溃退出

  1. runtimeException.

  2. ANR.

  3. 自己写的JNI类和C代码产生的信号异常.

  4. 第三方so包造成的Native信号异常.

因为我们公司的应用要求绝对不能发生崩溃退出的现象,所以我着手处理这四种异常,前三者都很容易处理(可以通过继承UncaughtExceptionHandler ;或者通过收听系统ANR广播;或者自己写C中模仿java中的try-cache功能捕获信号异常并处理),就第四种比较棘手.

捕获native异常需要做两步工作

  1. 在c底层捕获到native信号

  2. 收到native信号之后,在c层的信号处理函数,通过反射,调用java中的方法;

在c底层捕获到native信号也很简单,使用signal注册即可,收到native信号之后,就直接走到信号处理函数中了.
最麻烦的是第二步,如何反射回去.

目前碰到的问题

目前的问题是,如何收到native信号之后,在c语言的信号处理函数中,通过反射调用Java中的方法.

普通的c层通过反射调用java层的方法也是没有问题的,但是目前的问题是,在信号处理函数中,无法调用,或者是没有效果,因为当捕获到信号的时候,原来的进程马上就要关闭了.
我目前的试过的方法有

  1. 在信号处理函数中,调用原Activity的方法,不好用

  2. 在信号处理函数中,调用另一个进程的Activity的方法(在清单文件中配置process),不好用.

  3. 在信号处理函数中,抛出异常,抛不出去.

  4. 在信号处理函数中,抛出异常(提前取消默认的关闭操作),可以抛出,但是不会被java层的异常捕获类所抓住(但是不是在信号处理函数中抛的,是可以被抓住并处理的).

慕田峪9158850
浏览 699回答 2
2回答

波斯汪

(env)->CallVoidMethod(env, obj, methodID, (env)->NewStringUTF(env, "你好世界"));在错误发生之前是可以回调到的,但是异常发生后就回调不到了
随时随地看视频慕课网APP

相关分类

Java
我要回答