@@ -62,19 +62,25 @@ METHOD_LOOKUP_DEFINITION(firebase_crashlytics,
6262 CRASHLYTICS_METHODS, CRASHLYTICS_FIELDS)
6363
6464// clang-format off
65+ #define CRASHLYTICS_CORE_METHODS (X ) \
66+ X (LogFatalException, " logFatalException" , \
67+ " (Ljava/lang/Throwable;)V" , \
68+ util::kMethodTypeInstance )
69+
6570#define CRASHLYTICS_CORE_FIELDS (X ) \
6671 X (DataCollectionArbiter, " dataCollectionArbiter" , \
6772 " Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;" , \
6873 util::kFieldTypeInstance )
6974
7075// clang-format on
7176METHOD_LOOKUP_DECLARATION (crashlytics_core,
72- METHOD_LOOKUP_NONE, CRASHLYTICS_CORE_FIELDS)
77+ CRASHLYTICS_CORE_METHODS,
78+ CRASHLYTICS_CORE_FIELDS)
7379METHOD_LOOKUP_DEFINITION (
7480 crashlytics_core,
7581 PROGUARD_KEEP_CLASS
7682 " com/google/firebase/crashlytics/internal/common/CrashlyticsCore" ,
77- METHOD_LOOKUP_NONE , CRASHLYTICS_CORE_FIELDS)
83+ CRASHLYTICS_CORE_METHODS , CRASHLYTICS_CORE_FIELDS)
7884
7985// clang-format off
8086#define CRASHLYTICS_DATA_COLLECTION_METHODS (X ) \
@@ -144,6 +150,7 @@ bool cached_data_collection_enabled_ = false;
144150
145151CrashlyticsInternal::CrashlyticsInternal (App* app) {
146152 data_collection_obj_ = nullptr ;
153+ core_ = nullptr ;
147154 obj_ = nullptr ;
148155 java_vm_ = app->java_vm ();
149156
@@ -188,6 +195,7 @@ CrashlyticsInternal::CrashlyticsInternal(App* app) {
188195 env->DeleteLocalRef (application_context);
189196 assert (data_collection_obj != nullptr );
190197 data_collection_obj_ = env->NewGlobalRef (data_collection_obj);
198+ core_ = env->NewGlobalRef (core);
191199 env->DeleteLocalRef (data_collection_obj);
192200 env->DeleteLocalRef (core);
193201
@@ -212,6 +220,10 @@ CrashlyticsInternal::~CrashlyticsInternal() {
212220 env->DeleteGlobalRef (data_collection_obj_);
213221 data_collection_obj_ = nullptr ;
214222 }
223+ if (core_) {
224+ env->DeleteGlobalRef (core_);
225+ core_ = nullptr ;
226+ }
215227 Terminate ();
216228 java_vm_ = nullptr ;
217229
@@ -227,6 +239,7 @@ bool CrashlyticsInternal::Initialize(JNIEnv* env, jobject activity) {
227239 if (!(firebase_crashlytics::CacheMethodIds (env, activity) &&
228240 firebase_crashlytics::CacheFieldIds (env, activity) &&
229241 firebase_crashlytics_ndk::CacheMethodIds (env, activity) &&
242+ crashlytics_core::CacheMethodIds (env, activity) &&
230243 crashlytics_core::CacheFieldIds (env, activity) &&
231244 crashlytics_data_collection::CacheMethodIds (env, activity) &&
232245 java_exception::CacheMethodIds (env, activity) &&
@@ -340,6 +353,29 @@ void CrashlyticsInternal::LogException(
340353 env->DeleteLocalRef (exception_object);
341354}
342355
356+ void CrashlyticsInternal::LogExceptionAsFatal (
357+ const char * name, const char * reason,
358+ std::vector<firebase::crashlytics::Frame> frames) {
359+ if (!cached_data_collection_enabled_) {
360+ return ;
361+ }
362+ JNIEnv* env = util::GetThreadsafeJNIEnv (java_vm_);
363+
364+ std::string message (name);
365+ message += EXCEPTION_MESSAGE_SEPARATOR;
366+ message += reason;
367+
368+ jobject exception_object = BuildJavaException (message, frames);
369+
370+ env->CallVoidMethod (
371+ core_,
372+ crashlytics_core::GetMethodId (crashlytics_core::kLogFatalException ),
373+ exception_object);
374+ util::LogException (env, kLogLevelError ,
375+ " Crashlytics::LogExceptionAsFatal() failed" );
376+ env->DeleteLocalRef (exception_object);
377+ }
378+
343379bool CrashlyticsInternal::GetCrashlyticsCollectionEnabled (
344380 JavaVM* java_vm, jobject data_collection_obj) {
345381 JNIEnv* env = util::GetThreadsafeJNIEnv (java_vm);
0 commit comments