我正在尝试使用我的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然后发送虚假报告...
答案 0 :(得分:0)
在JVM为致命错误调用abort()
之后,无法保证能够执行任何Java处理。每the Java documentation:
SIGABRT
HotSpot VM无法处理此信号。相反,它调用中止 致命错误处理后的功能。如果应用程序使用此 然后它应该终止进程以保留预期 语义。
是的,这是针对Oracle实施的。它很可能也适用于所有其他实现。
因为在调用abort()
时,JVM预计会被杀死。