【问题标题】:Send report after Android JNI signal/exception在 Android JNI 信号/异常之后发送报告
【发布时间】:2016-06-16 13:31:03
【问题描述】:

我正在尝试让 firebase 与我的 Android 应用程序一起工作,但它主要是 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 然后发送虚假报告...

【问题讨论】:

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


    【解决方案1】:

    在 JVM 调用 abort() 出现致命错误后,不能保证您能够执行任何 Java 处理。每the Java documentation

    SIGABRT

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多