emacs-diffs
[Top][All Lists]
Advanced

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

feature/android 9b79f429ed 5/5: Port emacsclient wrapper to Android 7.1


From: Po Lu
Subject: feature/android 9b79f429ed 5/5: Port emacsclient wrapper to Android 7.1 and earlier
Date: Mon, 6 Feb 2023 09:56:04 -0500 (EST)

branch: feature/android
commit 9b79f429edd173efd6ecbdcb2f0a5fafa8d6e523
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Port emacsclient wrapper to Android 7.1 and earlier
    
    * java/org/gnu/emacs/EmacsNative.java (EmacsNative): Load every
    native library on which Emacs depends prior to loading libemacs
    itself.
    
    * java/org/gnu/emacs/EmacsOpenActivity.java (readEmacsClientLog)
    (EmacsOpenActivity, startEmacsClient): Don't use redirectError
    on Android 7.1 and earlier.
---
 java/org/gnu/emacs/EmacsNative.java       | 152 ++++++++++++++++++++++++++++++
 java/org/gnu/emacs/EmacsOpenActivity.java |  33 +++++--
 2 files changed, 177 insertions(+), 8 deletions(-)

diff --git a/java/org/gnu/emacs/EmacsNative.java 
b/java/org/gnu/emacs/EmacsNative.java
index aba356051c..939348ba42 100644
--- a/java/org/gnu/emacs/EmacsNative.java
+++ b/java/org/gnu/emacs/EmacsNative.java
@@ -159,6 +159,158 @@ public class EmacsNative
 
   static
   {
+    /* Older versions of Android cannot link correctly with shared
+       libraries that link with other shared libraries built along
+       Emacs unless all requisite shared libraries are explicitly
+       loaded from Java.
+
+       Every time you add a new shared library dependency to Emacs,
+       please add it here as well.  */
+
+    try
+      {
+       System.loadLibrary ("png_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("selinux_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("crypto_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("pcre_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("packagelistparser_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("gnutls_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("gmp_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("nettle_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("p11-kit_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("tasn1_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("hogweed_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("jansson_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("jpeg_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("tiff_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("xml2_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
+    try
+      {
+       System.loadLibrary ("icuuc_emacs");
+      }
+    catch (UnsatisfiedLinkError exception)
+      {
+       /* Ignore this exception.  */
+      }
+
     System.loadLibrary ("emacs");
   };
 };
diff --git a/java/org/gnu/emacs/EmacsOpenActivity.java 
b/java/org/gnu/emacs/EmacsOpenActivity.java
index e987e067a7..baf31039ec 100644
--- a/java/org/gnu/emacs/EmacsOpenActivity.java
+++ b/java/org/gnu/emacs/EmacsOpenActivity.java
@@ -125,6 +125,16 @@ public class EmacsOpenActivity extends Activity
     int rc;
     String what;
 
+    /* Because the ProcessBuilder functions necessary to redirect
+       process output are not implemented on Android 7 and earlier,
+       print a generic error message.  */
+
+    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
+      return ("This is likely because the Emacs server"
+             + " is not running, or because you did"
+             + " not grant Emacs permission to access"
+             + " external storage.");
+
     cache = getCacheDir ();
     file = new File (cache, "emacsclient.log");
     what = "";
@@ -199,7 +209,8 @@ public class EmacsOpenActivity extends Activity
 
      Use TITLE as the title of the dialog.  If TEXT is non-NULL,
      display that text in the dialog.  Otherwise, use the contents of
-     emacsclient.log in the cache directory instead.  */
+     emacsclient.log in the cache directory instead, or describe why
+     that file cannot be read.  */
 
   public void
   finishFailure (final String title, final String text)
@@ -240,20 +251,26 @@ public class EmacsOpenActivity extends Activity
     EmacsClientThread thread;
     File file;
 
-    file = new File (getCacheDir (), "emacsclient.log");
-
     libDir = getLibraryDirectory ();
     builder = new ProcessBuilder (libDir + "/libemacsclient.so",
                                  fileName, "--reuse-frame",
                                  "--timeout=10", "--no-wait");
 
-    /* Redirect standard error to a file so that errors can be
-       meaningfully reported.  */
+    /* Redirection is unfortunately not possible in Android 7 and
+       earlier.  */
 
-    if (file.exists ())
-      file.delete ();
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+      {
+       file = new File (getCacheDir (), "emacsclient.log");
 
-    builder.redirectError (file);
+       /* Redirect standard error to a file so that errors can be
+          meaningfully reported.  */
+
+       if (file.exists ())
+         file.delete ();
+
+       builder.redirectError (file);
+      }
 
     /* Track process output in a new thread, since this is the UI
        thread and doing so here can cause deadlocks when EmacsService



reply via email to

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