aboutsummaryrefslogtreecommitdiffstats
path: root/src/android.c
diff options
context:
space:
mode:
authorPo Lu2023-09-21 09:13:09 +0800
committerPo Lu2023-09-21 09:13:09 +0800
commit19857b51b0e04d62d7e82fa285db2f40dfbaf75d (patch)
tree6a938dd58e22d679f4c0d3a8e3fba8e854ac2b91 /src/android.c
parentef8458558d5d3b95c88e71ec88feb7f950e44b7e (diff)
downloademacs-19857b51b0e04d62d7e82fa285db2f40dfbaf75d.tar.gz
emacs-19857b51b0e04d62d7e82fa285db2f40dfbaf75d.zip
Update Android port
* src/android.c (android_query_tree, android_get_geometry) (android_translate_coordinates, android_wc_lookup_string) (android_get_keysym_name, android_browse_url) (android_query_battery): * src/androidmenu.c (android_dismiss_menu, android_menu_show): Circumvent JNI dynamic method dispatch overhead.
Diffstat (limited to 'src/android.c')
-rw-r--r--src/android.c79
1 files changed, 47 insertions, 32 deletions
diff --git a/src/android.c b/src/android.c
index 4caaf377781..6142f2be8ff 100644
--- a/src/android.c
+++ b/src/android.c
@@ -4963,15 +4963,17 @@ android_query_tree (android_window handle, android_window *root_return,
4963 jsize nelements, i; 4963 jsize nelements, i;
4964 android_window *children; 4964 android_window *children;
4965 jshort *shorts; 4965 jshort *shorts;
4966 jmethodID method;
4966 4967
4967 window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); 4968 window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW);
4968 4969
4969 /* window can be NULL, so this is a service method. */ 4970 /* window can be NULL, so this is a service method. */
4971 method = service_class.query_tree;
4970 array 4972 array
4971 = (*android_java_env)->CallObjectMethod (android_java_env, 4973 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env,
4972 emacs_service, 4974 emacs_service,
4973 service_class.query_tree, 4975 service_class.class,
4974 window); 4976 method, window);
4975 android_exception_check (); 4977 android_exception_check ();
4976 4978
4977 /* The first element of the array is the parent window. The rest 4979 /* The first element of the array is the parent window. The rest
@@ -5024,9 +5026,10 @@ android_get_geometry (android_window handle,
5024 get_geometry = window_class.get_window_geometry; 5026 get_geometry = window_class.get_window_geometry;
5025 5027
5026 window_geometry 5028 window_geometry
5027 = (*android_java_env)->CallObjectMethod (android_java_env, 5029 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env,
5028 window, 5030 window,
5029 get_geometry); 5031 window_class.class,
5032 get_geometry);
5030 android_exception_check (); 5033 android_exception_check ();
5031 5034
5032 /* window_geometry is an array containing x, y, width and 5035 /* window_geometry is an array containing x, y, width and
@@ -5084,9 +5087,11 @@ android_translate_coordinates (android_window src, int x,
5084 window = android_resolve_handle (src, ANDROID_HANDLE_WINDOW); 5087 window = android_resolve_handle (src, ANDROID_HANDLE_WINDOW);
5085 method = window_class.translate_coordinates; 5088 method = window_class.translate_coordinates;
5086 coordinates 5089 coordinates
5087 = (*android_java_env)->CallObjectMethod (android_java_env, 5090 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env,
5088 window, method, 5091 window,
5089 (jint) x, (jint) y); 5092 window_class.class,
5093 method, (jint) x,
5094 (jint) y);
5090 android_exception_check (); 5095 android_exception_check ();
5091 5096
5092 /* The array must contain two elements: X, Y translated to the root 5097 /* The array must contain two elements: X, Y translated to the root
@@ -5124,7 +5129,9 @@ android_wc_lookup_string (android_key_pressed_event *event,
5124 const jchar *characters; 5129 const jchar *characters;
5125 jsize size; 5130 jsize size;
5126 size_t i; 5131 size_t i;
5132 JNIEnv *env;
5127 5133
5134 env = android_java_env;
5128 status = ANDROID_LOOKUP_NONE; 5135 status = ANDROID_LOOKUP_NONE;
5129 rc = 0; 5136 rc = 0;
5130 5137
@@ -5175,9 +5182,10 @@ android_wc_lookup_string (android_key_pressed_event *event,
5175 { 5182 {
5176 window = android_handles[event->window].handle; 5183 window = android_handles[event->window].handle;
5177 string 5184 string
5178 = (*android_java_env)->CallObjectMethod (android_java_env, window, 5185 = (*env)->CallNonvirtualObjectMethod (env, window,
5179 window_class.lookup_string, 5186 window_class.class,
5180 (jint) event->serial); 5187 window_class.lookup_string,
5188 (jint) event->serial);
5181 android_exception_check (); 5189 android_exception_check ();
5182 5190
5183 if (!string) 5191 if (!string)
@@ -5185,13 +5193,11 @@ android_wc_lookup_string (android_key_pressed_event *event,
5185 else 5193 else
5186 { 5194 {
5187 /* Now return this input method string. */ 5195 /* Now return this input method string. */
5188 characters = (*android_java_env)->GetStringChars (android_java_env, 5196 characters = (*env)->GetStringChars (env, string, NULL);
5189 string, NULL);
5190 android_exception_check_nonnull ((void *) characters, string); 5197 android_exception_check_nonnull ((void *) characters, string);
5191 5198
5192 /* Figure out how big the string is. */ 5199 /* Establish the size of the the string. */
5193 size = (*android_java_env)->GetStringLength (android_java_env, 5200 size = (*env)->GetStringLength (env, string);
5194 string);
5195 5201
5196 /* Copy over the string data. */ 5202 /* Copy over the string data. */
5197 for (i = 0; i < MIN ((unsigned int) wchars_buffer, size); ++i) 5203 for (i = 0; i < MIN ((unsigned int) wchars_buffer, size); ++i)
@@ -5210,8 +5216,7 @@ android_wc_lookup_string (android_key_pressed_event *event,
5210 else 5216 else
5211 rc = size; 5217 rc = size;
5212 5218
5213 (*android_java_env)->ReleaseStringChars (android_java_env, string, 5219 (*env)->ReleaseStringChars (env, string, characters);
5214 characters);
5215 ANDROID_DELETE_LOCAL_REF (string); 5220 ANDROID_DELETE_LOCAL_REF (string);
5216 } 5221 }
5217 } 5222 }
@@ -5425,11 +5430,15 @@ android_get_keysym_name (int keysym, char *name_return, size_t size)
5425{ 5430{
5426 jobject string; 5431 jobject string;
5427 const char *buffer; 5432 const char *buffer;
5433 jmethodID method;
5428 5434
5429 string = (*android_java_env)->CallObjectMethod (android_java_env, 5435 method = service_class.name_keysym;
5430 emacs_service, 5436 string
5431 service_class.name_keysym, 5437 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env,
5432 (jint) keysym); 5438 emacs_service,
5439 service_class.class,
5440 method,
5441 (jint) keysym);
5433 android_exception_check (); 5442 android_exception_check ();
5434 5443
5435 buffer = (*android_java_env)->GetStringUTFChars (android_java_env, 5444 buffer = (*android_java_env)->GetStringUTFChars (android_java_env,
@@ -6136,11 +6145,13 @@ android_browse_url (Lisp_Object url, Lisp_Object send)
6136 const char *buffer; 6145 const char *buffer;
6137 6146
6138 string = android_build_string (url); 6147 string = android_build_string (url);
6139 value = (*android_java_env)->CallObjectMethod (android_java_env, 6148 value
6140 emacs_service, 6149 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env,
6141 service_class.browse_url, 6150 emacs_service,
6142 string, 6151 service_class.class,
6143 (jboolean) !NILP (send)); 6152 service_class.browse_url,
6153 string,
6154 (jboolean) !NILP (send));
6144 android_exception_check (); 6155 android_exception_check ();
6145 6156
6146 ANDROID_DELETE_LOCAL_REF (string); 6157 ANDROID_DELETE_LOCAL_REF (string);
@@ -6205,10 +6216,14 @@ android_query_battery (struct android_battery_state *status)
6205{ 6216{
6206 jlongArray array; 6217 jlongArray array;
6207 jlong *longs; 6218 jlong *longs;
6219 jmethodID method;
6208 6220
6209 array = (*android_java_env)->CallObjectMethod (android_java_env, 6221 method = service_class.query_battery;
6210 emacs_service, 6222 array
6211 service_class.query_battery); 6223 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env,
6224 emacs_service,
6225 service_class.class,
6226 method);
6212 android_exception_check (); 6227 android_exception_check ();
6213 6228
6214 /* A NULL return with no exception means that battery information 6229 /* A NULL return with no exception means that battery information