From b01c6135ea457b5a82ab17ef48b0e14550966ef9 Mon Sep 17 00:00:00 2001 From: Siarhei Vishniakou Date: Wed, 12 Feb 2020 16:15:28 -0800 Subject: [PATCH] Cache VerifiedInputEvent class references Currently, the variables 'clazz' and 'constructor' are not stored properly. Cache them to make it consistent with all of the other jni code. This would also prevent a crash in checkjni for using deleted local reference (it's never made global in the current code). Bug: 134977432 Test: atest VerifyInputEventTest (run several times) Change-Id: Icef5271d915fce49b24d987923942fbdc4b6898b --- core/jni/AndroidRuntime.cpp | 4 +++ core/jni/android_view_VerifiedKeyEvent.cpp | 27 ++++++++++++------ core/jni/android_view_VerifiedMotionEvent.cpp | 28 +++++++++++++------ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index b47b7e39d1e88..0b1c8b7f5335c 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -182,6 +182,8 @@ extern int register_android_view_KeyEvent(JNIEnv* env); extern int register_android_view_MotionEvent(JNIEnv* env); extern int register_android_view_PointerIcon(JNIEnv* env); extern int register_android_view_VelocityTracker(JNIEnv* env); +extern int register_android_view_VerifiedKeyEvent(JNIEnv* env); +extern int register_android_view_VerifiedMotionEvent(JNIEnv* env); extern int register_android_content_res_ObbScanner(JNIEnv* env); extern int register_android_content_res_Configuration(JNIEnv* env); extern int register_android_animation_PropertyValuesHolder(JNIEnv *env); @@ -1562,6 +1564,8 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_view_MotionEvent), REG_JNI(register_android_view_PointerIcon), REG_JNI(register_android_view_VelocityTracker), + REG_JNI(register_android_view_VerifiedKeyEvent), + REG_JNI(register_android_view_VerifiedMotionEvent), REG_JNI(register_android_content_res_ObbScanner), REG_JNI(register_android_content_res_Configuration), diff --git a/core/jni/android_view_VerifiedKeyEvent.cpp b/core/jni/android_view_VerifiedKeyEvent.cpp index 8fc301ccc735f..bba10aa0afeb5 100644 --- a/core/jni/android_view_VerifiedKeyEvent.cpp +++ b/core/jni/android_view_VerifiedKeyEvent.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_TAG "MotionEvent-JNI" +#define LOG_TAG "VerifiedKey-JNI" #include "android_view_VerifiedKeyEvent.h" #include @@ -22,18 +22,29 @@ namespace android { +static struct { + jclass clazz; + + jmethodID constructor; +} gVerifiedKeyEventClassInfo; + // ---------------------------------------------------------------------------- jobject android_view_VerifiedKeyEvent(JNIEnv* env, const VerifiedKeyEvent& event) { - static jclass clazz = FindClassOrDie(env, "android/view/VerifiedKeyEvent"); + return env->NewObject(gVerifiedKeyEventClassInfo.clazz, gVerifiedKeyEventClassInfo.constructor, + event.deviceId, event.eventTimeNanos, event.source, event.displayId, + event.action, event.downTimeNanos, event.flags, event.keyCode, + event.scanCode, event.metaState, event.repeatCount); +} - static jmethodID constructor = GetMethodIDOrDie(env, clazz, "", "(IJIIIJIIIII)V"); +int register_android_view_VerifiedKeyEvent(JNIEnv* env) { + jclass clazz = FindClassOrDie(env, "android/view/VerifiedKeyEvent"); + gVerifiedKeyEventClassInfo.clazz = MakeGlobalRefOrDie(env, clazz); - jobject object = - env->NewObject(clazz, constructor, event.deviceId, event.eventTimeNanos, event.source, - event.displayId, event.action, event.downTimeNanos, event.flags, - event.keyCode, event.scanCode, event.metaState, event.repeatCount); - return object; + gVerifiedKeyEventClassInfo.constructor = + GetMethodIDOrDie(env, clazz, "", "(IJIIIJIIIII)V"); + + return OK; } } // namespace android diff --git a/core/jni/android_view_VerifiedMotionEvent.cpp b/core/jni/android_view_VerifiedMotionEvent.cpp index 7a5c71aa6602f..c2811975ce232 100644 --- a/core/jni/android_view_VerifiedMotionEvent.cpp +++ b/core/jni/android_view_VerifiedMotionEvent.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_TAG "MotionEvent-JNI" +#define LOG_TAG "VerifiedMotion-JNI" #include "android_view_VerifiedMotionEvent.h" #include @@ -22,18 +22,30 @@ namespace android { +static struct { + jclass clazz; + + jmethodID constructor; +} gVerifiedMotionEventClassInfo; + // ---------------------------------------------------------------------------- jobject android_view_VerifiedMotionEvent(JNIEnv* env, const VerifiedMotionEvent& event) { - static jclass clazz = FindClassOrDie(env, "android/view/VerifiedMotionEvent"); + return env->NewObject(gVerifiedMotionEventClassInfo.clazz, + gVerifiedMotionEventClassInfo.constructor, event.deviceId, + event.eventTimeNanos, event.source, event.displayId, event.rawX, + event.rawY, event.actionMasked, event.downTimeNanos, event.flags, + event.metaState, event.buttonState); +} - static jmethodID constructor = GetMethodIDOrDie(env, clazz, "", "(IJIIFFIJIII)V"); +int register_android_view_VerifiedMotionEvent(JNIEnv* env) { + jclass clazz = FindClassOrDie(env, "android/view/VerifiedMotionEvent"); + gVerifiedMotionEventClassInfo.clazz = MakeGlobalRefOrDie(env, clazz); - jobject object = - env->NewObject(clazz, constructor, event.deviceId, event.eventTimeNanos, event.source, - event.displayId, event.rawX, event.rawY, event.actionMasked, - event.downTimeNanos, event.flags, event.metaState, event.buttonState); - return object; + gVerifiedMotionEventClassInfo.constructor = + GetMethodIDOrDie(env, clazz, "", "(IJIIFFIJIII)V"); + + return OK; } } // namespace android