Check exceptions in BBQ and SC JNI code
Updates the following callback wrappers to crash the client when exceptions are thrown: * TransactionCommittedListenerWrapper * TransactionHangCallbackWrapper * TrustedPresentationCallbackWrapper * WindowInfosReportedListenerWrapper This prevents misleading error messages where a later JNI call fails due to a pending Java exception. Bug: 278526360 Bug: 278573545 Test: presubmits Change-Id: I796e46640b6d1ab43152de9040cbc4b7f25addb9
This commit is contained in:
@@ -52,7 +52,7 @@ static JNIEnv* getenv(JavaVM* vm) {
|
||||
return env;
|
||||
}
|
||||
|
||||
struct {
|
||||
struct {
|
||||
jmethodID onTransactionHang;
|
||||
} gTransactionHangCallback;
|
||||
|
||||
@@ -72,12 +72,14 @@ public:
|
||||
}
|
||||
|
||||
void onTransactionHang(const std::string& reason) {
|
||||
if (mTransactionHangObject) {
|
||||
JNIEnv* env = getenv(mVm);
|
||||
ScopedLocalRef<jstring> jReason(env, env->NewStringUTF(reason.c_str()));
|
||||
getenv(mVm)->CallVoidMethod(mTransactionHangObject,
|
||||
gTransactionHangCallback.onTransactionHang, jReason.get());
|
||||
if (!mTransactionHangObject) {
|
||||
return;
|
||||
}
|
||||
JNIEnv* env = getenv(mVm);
|
||||
ScopedLocalRef<jstring> jReason(env, env->NewStringUTF(reason.c_str()));
|
||||
getenv(mVm)->CallVoidMethod(mTransactionHangObject,
|
||||
gTransactionHangCallback.onTransactionHang, jReason.get());
|
||||
DieIfException(env, "Uncaught exception in TransactionHangCallback.");
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -285,6 +285,7 @@ public:
|
||||
JNIEnv* env = getenv();
|
||||
env->CallVoidMethod(mTransactionCommittedListenerObject,
|
||||
gTransactionCommittedListenerClassInfo.onTransactionCommitted);
|
||||
DieIfException(env, "Uncaught exception in TransactionCommittedListener.");
|
||||
}
|
||||
|
||||
static void transactionCallbackThunk(void* context, nsecs_t /*latchTime*/,
|
||||
@@ -325,6 +326,7 @@ public:
|
||||
binder::Status onWindowInfosReported() override {
|
||||
JNIEnv* env = getenv();
|
||||
env->CallVoidMethod(mListener, gRunnableClassInfo.run);
|
||||
DieIfException(env, "Uncaught exception in WindowInfosReportedListener.");
|
||||
return binder::Status::ok();
|
||||
}
|
||||
|
||||
@@ -356,6 +358,7 @@ public:
|
||||
env->CallVoidMethod(mTrustedPresentationCallback,
|
||||
gTrustedPresentationCallbackClassInfo.onTrustedPresentationChanged,
|
||||
inTrustedPresentationState);
|
||||
DieIfException(env, "Uncaught exception in TrustedPresentationCallback.");
|
||||
}
|
||||
|
||||
void addCallbackRef(const sp<SurfaceComposerClient::PresentationCallbackRAII>& callbackRef) {
|
||||
|
||||
@@ -134,6 +134,15 @@ static inline JNIEnv* GetOrAttachJNIEnvironment(JavaVM* jvm, jint version = JNI_
|
||||
return env;
|
||||
}
|
||||
|
||||
static inline void DieIfException(JNIEnv* env, const char* message) {
|
||||
if (env->ExceptionCheck()) {
|
||||
jnihelp::ExpandableString summary;
|
||||
jnihelp::ExpandableStringInitialize(&summary);
|
||||
jnihelp::GetStackTraceOrSummary(env, nullptr, &summary);
|
||||
LOG_ALWAYS_FATAL("%s\n%s", message, summary.data);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif // CORE_JNI_HELPERS
|
||||
|
||||
Reference in New Issue
Block a user