From 8dc00dc22250b383e7692fc761cbca25b014aa8a Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 18 May 2024 20:45:35 +0800 Subject: Housekeeping around androidselect.c * java/org/gnu/emacs/EmacsClipboard.java (setClipboard) (getClipboard): * java/org/gnu/emacs/EmacsSdk11Clipboard.java (setClipboard) (getClipboard): * java/org/gnu/emacs/EmacsSdk8Clipboard.java (setClipboard) (getClipboard): Save and return Strings rather than byte arrays. * src/androidselect.c (android_init_emacs_clipboard) (Fandroid_set_clipboard, Fandroid_get_clipboard): Adjust to match. --- src/androidselect.c | 56 ++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) (limited to 'src/androidselect.c') diff --git a/src/androidselect.c b/src/androidselect.c index 7c93607848a..50982738743 100644 --- a/src/androidselect.c +++ b/src/androidselect.c @@ -94,10 +94,10 @@ android_init_emacs_clipboard (void) name, signature); \ eassert (clipboard_class.c_name); - FIND_METHOD (set_clipboard, "setClipboard", "([B)V"); + FIND_METHOD (set_clipboard, "setClipboard", "(Ljava/lang/String;)V"); FIND_METHOD (owns_clipboard, "ownsClipboard", "()I"); FIND_METHOD (clipboard_exists, "clipboardExists", "()Z"); - FIND_METHOD (get_clipboard, "getClipboard", "()[B"); + FIND_METHOD (get_clipboard, "getClipboard", "()Ljava/lang/String;"); FIND_METHOD (get_clipboard_targets, "getClipboardTargets", "()[Ljava/lang/String;"); FIND_METHOD (get_clipboard_data, "getClipboardData", @@ -151,28 +151,26 @@ DEFUN ("android-set-clipboard", Fandroid_set_clipboard, doc: /* Set the clipboard text to STRING. */) (Lisp_Object string) { - jarray bytes; + jstring text; if (!android_init_gui) error ("Accessing clipboard without display connection"); CHECK_STRING (string); - string = ENCODE_UTF_8 (string); + string = code_convert_string_norecord (string, Qandroid_jni, + true); - bytes = (*android_java_env)->NewByteArray (android_java_env, - SBYTES (string)); + text = (*android_java_env)->NewStringUTF (android_java_env, + SSDATA (string)); android_exception_check (); - (*android_java_env)->SetByteArrayRegion (android_java_env, bytes, - 0, SBYTES (string), - (jbyte *) SDATA (string)); (*android_java_env)->CallVoidMethod (android_java_env, clipboard, clipboard_class.set_clipboard, - bytes); - android_exception_check_1 (bytes); + text); + android_exception_check_1 (text); + ANDROID_DELETE_LOCAL_REF (text); - ANDROID_DELETE_LOCAL_REF (bytes); return Qnil; } @@ -185,39 +183,39 @@ Alternatively, return nil if the clipboard is empty. */) (void) { Lisp_Object string; - jarray bytes; + jstring text; jmethodID method; - size_t length; - jbyte *data; + jsize length; + const char *data; if (!android_init_gui) error ("No Android display connection!"); method = clipboard_class.get_clipboard; - bytes + text = (*android_java_env)->CallObjectMethod (android_java_env, clipboard, method); android_exception_check (); - if (!bytes) + if (!text) return Qnil; - length = (*android_java_env)->GetArrayLength (android_java_env, - bytes); - data = (*android_java_env)->GetByteArrayElements (android_java_env, - bytes, NULL); - android_exception_check_nonnull (data, bytes); - - string = make_unibyte_string ((char *) data, length); + /* Retrieve a pointer to the raw JNI-encoded bytes of the string. */ + length = (*android_java_env)->GetStringUTFLength (android_java_env, + text); + data = (*android_java_env)->GetStringUTFChars (android_java_env, text, + NULL); + android_exception_check_nonnull ((void *) data, text); - (*android_java_env)->ReleaseByteArrayElements (android_java_env, - bytes, data, - JNI_ABORT); - ANDROID_DELETE_LOCAL_REF (bytes); + /* Copy them into a unibyte string for decoding. */ + string = make_unibyte_string (data, length); + (*android_java_env)->ReleaseStringUTFChars (android_java_env, text, + data); + ANDROID_DELETE_LOCAL_REF (text); /* Now decode the resulting string. */ - return code_convert_string_norecord (string, Qutf_8, false); + return code_convert_string_norecord (string, Qandroid_jni, false); } DEFUN ("android-clipboard-exists-p", Fandroid_clipboard_exists_p, -- cgit v1.2.1