diff options
Diffstat (limited to 'src/android.c')
| -rw-r--r-- | src/android.c | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/src/android.c b/src/android.c index aa4033c676f..1424270e785 100644 --- a/src/android.c +++ b/src/android.c | |||
| @@ -5593,15 +5593,20 @@ android_verify_jni_string (const char *name) | |||
| 5593 | } | 5593 | } |
| 5594 | 5594 | ||
| 5595 | /* Given a Lisp string TEXT, return a local reference to an equivalent | 5595 | /* Given a Lisp string TEXT, return a local reference to an equivalent |
| 5596 | Java string. */ | 5596 | Java string. Each argument following TEXT should be NULL or a |
| 5597 | local reference that will be freed if creating the string fails, | ||
| 5598 | whereupon memory_full will also be signaled. */ | ||
| 5597 | 5599 | ||
| 5598 | jstring | 5600 | jstring |
| 5599 | android_build_string (Lisp_Object text) | 5601 | android_build_string (Lisp_Object text, ...) |
| 5600 | { | 5602 | { |
| 5601 | Lisp_Object encoded; | 5603 | Lisp_Object encoded; |
| 5602 | jstring string; | 5604 | jstring string; |
| 5603 | size_t nchars; | 5605 | size_t nchars; |
| 5604 | jchar *characters; | 5606 | jchar *characters; |
| 5607 | va_list ap; | ||
| 5608 | jobject object; | ||
| 5609 | |||
| 5605 | USE_SAFE_ALLOCA; | 5610 | USE_SAFE_ALLOCA; |
| 5606 | 5611 | ||
| 5607 | /* Directly encode TEXT if it contains no non-ASCII characters, or | 5612 | /* Directly encode TEXT if it contains no non-ASCII characters, or |
| @@ -5619,9 +5624,11 @@ android_build_string (Lisp_Object text) | |||
| 5619 | { | 5624 | { |
| 5620 | string = (*android_java_env)->NewStringUTF (android_java_env, | 5625 | string = (*android_java_env)->NewStringUTF (android_java_env, |
| 5621 | SSDATA (text)); | 5626 | SSDATA (text)); |
| 5622 | android_exception_check (); | ||
| 5623 | SAFE_FREE (); | ||
| 5624 | 5627 | ||
| 5628 | if ((*android_java_env)->ExceptionCheck (android_java_env)) | ||
| 5629 | goto error; | ||
| 5630 | |||
| 5631 | SAFE_FREE (); | ||
| 5625 | return string; | 5632 | return string; |
| 5626 | } | 5633 | } |
| 5627 | 5634 | ||
| @@ -5640,10 +5647,36 @@ android_build_string (Lisp_Object text) | |||
| 5640 | string | 5647 | string |
| 5641 | = (*android_java_env)->NewString (android_java_env, | 5648 | = (*android_java_env)->NewString (android_java_env, |
| 5642 | characters, nchars); | 5649 | characters, nchars); |
| 5643 | android_exception_check (); | 5650 | |
| 5651 | if ((*android_java_env)->ExceptionCheck (android_java_env)) | ||
| 5652 | goto error; | ||
| 5644 | 5653 | ||
| 5645 | SAFE_FREE (); | 5654 | SAFE_FREE (); |
| 5646 | return string; | 5655 | return string; |
| 5656 | |||
| 5657 | error: | ||
| 5658 | /* An exception arose while creating the string. When this | ||
| 5659 | transpires, an assumption is made that the error was induced by | ||
| 5660 | running out of memory. Delete each of the local references | ||
| 5661 | within AP. */ | ||
| 5662 | |||
| 5663 | va_start (ap, text); | ||
| 5664 | |||
| 5665 | __android_log_print (ANDROID_LOG_WARN, __func__, | ||
| 5666 | "Possible out of memory error. " | ||
| 5667 | " The Java exception follows: "); | ||
| 5668 | /* Describe exactly what went wrong. */ | ||
| 5669 | (*android_java_env)->ExceptionDescribe (android_java_env); | ||
| 5670 | (*android_java_env)->ExceptionClear (android_java_env); | ||
| 5671 | |||
| 5672 | /* Now remove each and every local reference provided after | ||
| 5673 | OBJECT. */ | ||
| 5674 | |||
| 5675 | while ((object = va_arg (ap, jobject))) | ||
| 5676 | ANDROID_DELETE_LOCAL_REF (object); | ||
| 5677 | |||
| 5678 | va_end (ap); | ||
| 5679 | memory_full (0); | ||
| 5647 | } | 5680 | } |
| 5648 | 5681 | ||
| 5649 | /* Do the same, except TEXT is constant string data in ASCII or | 5682 | /* Do the same, except TEXT is constant string data in ASCII or |
| @@ -6154,7 +6187,7 @@ android_browse_url (Lisp_Object url, Lisp_Object send) | |||
| 6154 | Lisp_Object tem; | 6187 | Lisp_Object tem; |
| 6155 | const char *buffer; | 6188 | const char *buffer; |
| 6156 | 6189 | ||
| 6157 | string = android_build_string (url); | 6190 | string = android_build_string (url, NULL); |
| 6158 | value | 6191 | value |
| 6159 | = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env, | 6192 | = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env, |
| 6160 | emacs_service, | 6193 | emacs_service, |