在Android JNI信号/例外

时间:2016-06-16 13:31:03

标签: android c++ firebase java-native-interface signals

我正在尝试使用我的Android应用程序使用firebase,但它主要是C ++代码。 很多机会是,如果有任何崩溃,它将是C ++部分中的某种不良访问。 Firebase适用于未捕获的java异常,但我无法使用JNI信号/异常。

据我所知,它与JNI尚未兼容,但我认为解决方法与此类似:

在C ++中,有些人为我们想要处理的信号添加了一个信号处理程序,它将把它发送回Java端并尝试发送报告(如果可能的话,还有部分栈跟踪)。

#include <cisgnal>
namespace
{
    void SignalHandler( int sig )
    {
         // Code to call a static method in my Activity
    }
}

CrashReporter::CrashReporter()
{
    ::signal( SIGABRT, & ::SignalHandler )
}

// In java
public static void SendReportOnCrash()
{
     FirebaseCrash.report( new Exception( "OOPS" ) );
}

不幸的是,虚假的报告永远不会被发送,但是我确实得到了Java的回调。 我尝试启动一个进程分离的活动,我将在其中调用FirebaseCrash.report(),但没有非静态方式,因此它总是崩溃,因为FirebaseApp / Crash未在辅助活动中实例化。

我来这里询问是否有人会暗示如何做到这一点。

我上次尝试但最不想要的测试是将堆栈跟踪写入文件,并在重新启动时测试此文件是否存在,如果是,请使用FirebaseCrash.log然后发送虚假报告...

1 个答案:

答案 0 :(得分:0)

在JVM为致命错误调用abort()之后,无法保证能够执行任何Java处理。每the Java documentation

  

SIGABRT

     

HotSpot VM无法处理此信号。相反,它调用中止   致命错误处理后的功能。如果应用程序使用此   然后它应该终止进程以保留预期   语义。

是的,这是针对Oracle实施的。它很可能也适用于所有其他实现。

因为在调用abort()时,JVM预计会被杀死。