emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master b2362cdcedf: Speed up Android context menu generation


From: Po Lu
Subject: master b2362cdcedf: Speed up Android context menu generation
Date: Sat, 16 Sep 2023 21:13:02 -0400 (EDT)

branch: master
commit b2362cdcedfea5e9ee827c41bf158bc7000640a6
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Speed up Android context menu generation
    
    * src/androidmenu.c (android_menu_show, android_dialog_show):
    Circumvent JNI dynamic method dispatch overhead.
---
 src/androidmenu.c | 77 +++++++++++++++++++++++++++++++------------------------
 1 file changed, 44 insertions(+), 33 deletions(-)

diff --git a/src/androidmenu.c b/src/androidmenu.c
index 94e3f646b44..70452b5dab0 100644
--- a/src/androidmenu.c
+++ b/src/androidmenu.c
@@ -261,9 +261,11 @@ android_menu_show (struct frame *f, int x, int y, int 
menuflags,
   struct android_menu_subprefix *subprefix_1;
   bool checkmark;
   unsigned int serial;
+  JNIEnv *env;
 
   count = SPECPDL_INDEX ();
   serial = ++current_menu_serial;
+  env = android_java_env;
 
   block_input ();
 
@@ -313,9 +315,10 @@ android_menu_show (struct frame *f, int x, int y, int 
menuflags,
             context menu.  */
          store = current_context_menu;
          current_context_menu
-           = (*android_java_env)->CallObjectMethod (android_java_env,
-                                                    current_context_menu,
-                                                    menu_class.parent);
+           = (*env)->CallNonvirtualObjectMethod (env,
+                                                 current_context_menu,
+                                                 menu_class.class,
+                                                 menu_class.parent);
          android_exception_check ();
 
          if (store != context_menu)
@@ -403,11 +406,12 @@ android_menu_show (struct frame *f, int x, int y, int 
menuflags,
 
              store = current_context_menu;
              current_context_menu
-               = (*android_java_env)->CallObjectMethod (android_java_env,
-                                                        current_context_menu,
-                                                        menu_class.add_submenu,
-                                                        title_string,
-                                                        help_string);
+               = (*env)->CallNonvirtualObjectMethod (env,
+                                                     current_context_menu,
+                                                     menu_class.class,
+                                                     menu_class.add_submenu,
+                                                     title_string,
+                                                     help_string);
              android_exception_check ();
 
              if (store != context_menu)
@@ -449,17 +453,18 @@ android_menu_show (struct frame *f, int x, int y, int 
menuflags,
              checkmark = (EQ (type, QCtoggle)
                           || EQ (type, QCradio));
 
-             (*android_java_env)->CallVoidMethod (android_java_env,
-                                                  current_context_menu,
-                                                  menu_class.add_item,
-                                                  (jint) item_id,
-                                                  title_string,
-                                                  (jboolean) !NILP (enable),
-                                                  (jboolean) checkmark,
-                                                  (jboolean) !NILP (selected),
-                                                  help_string,
-                                                  (jboolean) (EQ (type,
-                                                                  QCradio)));
+             (*env)->CallNonvirtualVoidMethod (env,
+                                               current_context_menu,
+                                               menu_class.class,
+                                               menu_class.add_item,
+                                               (jint) item_id,
+                                               title_string,
+                                               (jboolean) !NILP (enable),
+                                               (jboolean) checkmark,
+                                               (jboolean) !NILP (selected),
+                                               help_string,
+                                               (jboolean) (EQ (type,
+                                                               QCradio)));
              android_exception_check ();
 
              if (title_string)
@@ -479,12 +484,12 @@ android_menu_show (struct frame *f, int x, int y, int 
menuflags,
   /* Now, display the context menu.  */
   window = android_resolve_handle (FRAME_ANDROID_WINDOW (f),
                                   ANDROID_HANDLE_WINDOW);
-  rc = (*android_java_env)->CallBooleanMethod (android_java_env,
-                                              context_menu,
-                                              menu_class.display,
-                                              window, (jint) x,
-                                              (jint) y,
-                                              (jint) serial);
+  rc = (*env)->CallNonvirtualBooleanMethod (env, context_menu,
+                                           menu_class.class,
+                                           menu_class.display,
+                                           window, (jint) x,
+                                           (jint) y,
+                                           (jint) serial);
   android_exception_check ();
 
   if (!rc)
@@ -652,6 +657,7 @@ android_dialog_show (struct frame *f, Lisp_Object title,
   int id;
   jmethodID method;
   unsigned int serial;
+  JNIEnv *env;
 
   /* Generate a unique ID for events from this dialog box.  */
   serial = ++current_menu_serial;
@@ -690,6 +696,11 @@ android_dialog_show (struct frame *f, Lisp_Object title,
     ANDROID_DELETE_LOCAL_REF (java_header);
   ANDROID_DELETE_LOCAL_REF (java_title);
 
+  /* Save the JNI environment pointer prior to constructing the
+     dialog, as typing (*android_java_env)->... gives rise to very
+     long lines.  */
+  env = android_java_env;
+
   /* Create the buttons.  */
   i = MENU_ITEMS_PANE_LENGTH;
   while (i < menu_items_used)
@@ -722,11 +733,11 @@ android_dialog_show (struct frame *f, Lisp_Object title,
 
          /* Add the button.  */
          temp = android_build_string (item_name);
-         (*android_java_env)->CallVoidMethod (android_java_env,
-                                              dialog,
-                                              dialog_class.add_button,
-                                              temp, (jint) i,
-                                              (jboolean) NILP (enable));
+         (*env)->CallNonvirtualVoidMethod (env, dialog,
+                                           dialog_class.class,
+                                           dialog_class.add_button,
+                                           temp, (jint) i,
+                                           (jboolean) NILP (enable));
          android_exception_check ();
          ANDROID_DELETE_LOCAL_REF (temp);
          i += MENU_ITEMS_ITEM_LENGTH;
@@ -734,9 +745,9 @@ android_dialog_show (struct frame *f, Lisp_Object title,
     }
 
   /* The dialog is now built.  Run it.  */
-  rc = (*android_java_env)->CallBooleanMethod (android_java_env,
-                                              dialog,
-                                              dialog_class.display);
+  rc = (*env)->CallNonvirtualBooleanMethod (env, dialog,
+                                           dialog_class.class,
+                                           dialog_class.display);
   android_exception_check ();
 
   if (!rc)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]