diff options
| author | Po Lu | 2023-09-21 09:13:09 +0800 |
|---|---|---|
| committer | Po Lu | 2023-09-21 09:13:09 +0800 |
| commit | 19857b51b0e04d62d7e82fa285db2f40dfbaf75d (patch) | |
| tree | 6a938dd58e22d679f4c0d3a8e3fba8e854ac2b91 /src/android.c | |
| parent | ef8458558d5d3b95c88e71ec88feb7f950e44b7e (diff) | |
| download | emacs-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.c | 79 |
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 |