diff --git a/configure.ac b/configure.ac
index 3612cb8de78..28361be4211 100644
--- a/configure.ac
+++ b/configure.ac
@@ -49,6 +49,10 @@ if test "$XCONFIGURE" = "android"; then
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=32"
enable_largefile=no
enable_year2038=no])
+ # Prevent Gnulib from enabling time_rz.c on old Android releases, till
+ # Gnulib itself is fixed.
+ AS_IF([test "$ANDROID_SDK" -lt "35"],
+ [ac_cv_type_timezone_t=no])
fi
dnl Set emacs_config_options to the options of 'configure', quoted for the shell,
@@ -953,7 +957,7 @@ a valid path to android.jar. See config.log for more details.])
fi
AC_CACHE_CHECK([whether android.jar is new enough],
- [emacs_cv_android_u_or_later],
+ [emacs_cv_android_v_or_later],
AS_IF([rm -f conftest.class
cat << EOF > conftest.java
@@ -961,18 +965,18 @@ import android.os.Build;
class conftest
{
- private static int test = Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
+ private static int test = Build.VERSION_CODES.VANILLA_ICE_CREAM;
}
EOF
("$JAVAC" -classpath "$with_android" -target 1.7 -source 1.7 conftest.java \
-d . >&AS_MESSAGE_LOG_FD 2>&1) && test -s conftest.class && rm -f conftest.class],
- [emacs_cv_android_u_or_later=yes],
- [emacs_cv_android_u_or_later=no]))
+ [emacs_cv_android_v_or_later=yes],
+ [emacs_cv_android_v_or_later=no]))
- if test "$emacs_cv_android_u_or_later" = "no"; then
+ if test "$emacs_cv_android_v_or_later" = "no"; then
AC_MSG_ERROR([Emacs must be built with an android.jar file produced for \
-Android 14 (Upside Down Cake) or later.])
+Android 15 (Vanilla Ice Cream) or later.])
fi
dnl See if the Java compiler supports the `--release' option which
@@ -1181,6 +1185,8 @@ main (void)
foo = "emacs_api_33";
#elif __ANDROID_API__ < 35
foo = "emacs_api_34";
+#elif __ANDROID_API__ < 36
+ foo = "emacs_api_35";
#else
foo = "emacs_api_future";
#endif
diff --git a/cross/ndk-build/Makefile.in b/cross/ndk-build/Makefile.in
index b5eac9bd089..7f52f1784fb 100644
--- a/cross/ndk-build/Makefile.in
+++ b/cross/ndk-build/Makefile.in
@@ -35,6 +35,7 @@ NDK_BUILD_CXX_LDFLAGS = @NDK_BUILD_CXX_LDFLAGS@
NDK_BUILD_AR = @NDK_BUILD_AR@
NDK_BUILD_NASM = @NDK_BUILD_NASM@
NDK_BUILD_CFLAGS = @NDK_BUILD_CFLAGS@
+ NDK_BUILD_SO_LDFLAGS = @NDK_BUILD_SO_LDFLAGS@
# This is a list of targets to build.
NDK_BUILD_MODULES = @NDK_BUILD_MODULES@
diff --git a/cross/ndk-build/ndk-resolve.mk b/cross/ndk-build/ndk-resolve.mk
index 289e3a8a003..86a62d80a30 100644
--- a/cross/ndk-build/ndk-resolve.mk
+++ b/cross/ndk-build/ndk-resolve.mk
@@ -32,7 +32,9 @@ NDK_LOCAL_EXPORT_C_INCLUDES_$(LOCAL_MODULE) := $(LOCAL_EXPORT_C_INCLUDES) $(LOCA
NDK_LOCAL_A_NAMES_$(LOCAL_MODULE) :=
NDK_WHOLE_A_NAMES_$(LOCAL_MODULE) :=
NDK_LOCAL_SO_NAMES_$(LOCAL_MODULE) :=
-NDK_SO_EXTRA_FLAGS_$(LOCAL_MODULE) :=
+
+# Linker options enabling 16k page sizes.
+NDK_SO_EXTRA_FLAGS_$(LOCAL_MODULE) := $(NDK_BUILD_SO_LDFLAGS)
# List of all dependencies resolved for this module thus far.
# Used to avoid infinite recursion.
diff --git a/java/AndroidManifest.xml.in b/java/AndroidManifest.xml.in
index df00e497f8f..5c9714efab8 100644
--- a/java/AndroidManifest.xml.in
+++ b/java/AndroidManifest.xml.in
@@ -207,7 +207,7 @@ along with GNU Emacs. If not, see . -->
+ android:targetSdkVersion="35"/>
= Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ layout.setFitsSystemWindows (true);
+
/* Maybe start the Emacs service if necessary. */
EmacsService.startEmacsService (this);
diff --git a/java/org/gnu/emacs/EmacsFillPolygon.java b/java/org/gnu/emacs/EmacsFillPolygon.java
index 6bc8333984a..d99fdd97782 100644
--- a/java/org/gnu/emacs/EmacsFillPolygon.java
+++ b/java/org/gnu/emacs/EmacsFillPolygon.java
@@ -26,8 +26,11 @@
import android.graphics.Rect;
import android.graphics.RectF;
+import android.os.Build;
+
public final class EmacsFillPolygon
{
+ @SuppressWarnings ("deprecation") /* computeBounds (IZ) */
public static void
perform (EmacsDrawable drawable, EmacsGC gc, Point points[])
{
@@ -60,7 +63,15 @@ public final class EmacsFillPolygon
/* Compute the damage rectangle. */
rectF = new RectF (0, 0, 0, 0);
- path.computeBounds (rectF, true);
+
+ /* computeBounds (IZ) is deprecated but the incompetence of
+ Android's release management has caused its replacement to be
+ omitted from published header files. */
+
+ /* if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) */
+ path.computeBounds (rectF, true);
+ /* else
+ path.computeBounds (rectF); */
rect = new Rect ((int) Math.floor (rectF.left),
(int) Math.floor (rectF.top),
diff --git a/m4/ndk-build.m4 b/m4/ndk-build.m4
index a561c7c849d..64468f6fc96 100644
--- a/m4/ndk-build.m4
+++ b/m4/ndk-build.m4
@@ -56,11 +56,13 @@ ndk_ANY_CXX=
ndk_BUILD_CFLAGS="$4"
ndk_working_cxx=no
ndk_CXX_SHARED=
+ndk_BUILD_SO_LDFLAGS=
+ndk_want_16k_page_sizes=no
AS_CASE(["$ndk_ABI"],
- [*arm64*], [ndk_ARCH=arm64],
+ [*arm64*], [ndk_ARCH=arm64; ndk_want_16k_page_sizes=yes],
[*arm*], [ndk_ARCH=arm],
- [*x86_64*], [ndk_ARCH=x86_64],
+ [*x86_64*], [ndk_ARCH=x86_64; ndk_want_16k_page_sizes=yes],
[*x86*], [ndk_ARCH=x86],
[*mips64*], [ndk_ARCH=mips64],
[*mips*], [ndk_ARCH=mips],
@@ -519,8 +521,7 @@ AS_ECHO([])
AS_ECHO(["Library includes : $ndk_CXX_STL"])
AS_ECHO(["Linker options : $ndk_CXX_LDFLAGS"])
AS_ECHO(["Library file (if any) : $ndk_CXX_SHARED"])
-AS_ECHO([])
-])
+AS_ECHO([])])
# ndk_LATE_EARLY
# --------------
@@ -535,7 +536,7 @@ AC_DEFUN([ndk_LATE_EARLY],
# ndk_LATE
# --------
# Perform late initialization of the ndk-build system by checking for
-# required C and C++ headers.
+# required C and C++ headers and 16 KB page size support.
AC_DEFUN([ndk_LATE],
[dnl
@@ -543,10 +544,30 @@ AS_IF([test "$ndk_INITIALIZED" = "yes"],[
AS_IF([test -n "$CXX"], [
AC_LANG_PUSH([C++])
AC_CHECK_HEADER([string], [ndk_working_cxx=yes],
- [AC_MSG_WARN([Your C++ compiler is not properly configured, as \
+ [AC_MSG_WARN([Your C++ compiler is not properly configured, as
the standard library headers could not be found.])])
AC_LANG_POP([C++])])])
LDFLAGS="$ndk_save_LDFLAGS"
+dnl Detect whether this version of the NDK supports 16KB page sizes,
+dnl which are required on certain architectures to execute under Android
+dnl 15 (35) and later, and apply the appropriate linker options if
+dnl positive.
+AS_IF([test "$ndk_want_16k_page_sizes" = "yes"],
+ [AC_CACHE_CHECK([whether toolchain supports configurations with 16k page sizes],
+ [ndk_cv_16k_page_sizes],
+ [ndk_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -Wl,-z,max-page-size=16384"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
+ [ndk_cv_16k_page_sizes=yes],
+ [ndk_cv_16k_page_sizes=no])
+ LDFLAGS="$ndk_save_LDFLAGS"])
+ AS_IF([test "$ndk_cv_16k_page_sizes" = "yes"],
+ [LDFLAGS="$LDFLAGS -Wl,-z,max-page-size=16384"
+ ndk_BUILD_SO_LDFLAGS="-Wl,-z,max-page-size=16384"],
+ [AC_MSG_WARN([\
+Your toolchain does not support configurations with 16KB page sizes,
+and consequently binaries it produces cannot support all devices
+running Android 15 or later.])])])
])
# ndk_SEARCH_MODULE(MODULE, NAME, ACTION-IF-FOUND, [ACTION-IF-NOT-FOUND])
@@ -659,6 +680,7 @@ AC_DEFUN_ONCE([ndk_CONFIG_FILES],
NDK_BUILD_CXX_STL="$ndk_CXX_STL"
NDK_BUILD_CXX_LDFLAGS="$ndk_CXX_LDFLAGS"
NDK_BUILD_ANY_CXX_MODULE=$ndk_ANY_CXX
+ NDK_BUILD_SO_LDFLAGS="$ndk_BUILD_SO_LDFLAGS"
NDK_BUILD_CFLAGS="$ndk_BUILD_CFLAGS"
AC_SUBST([NDK_BUILD_ANDROID_MK])
@@ -674,6 +696,7 @@ AC_DEFUN_ONCE([ndk_CONFIG_FILES],
AC_SUBST([NDK_BUILD_CXX_STL])
AC_SUBST([NDK_BUILD_CXX_LDFLAGS])
AC_SUBST([NDK_BUILD_ANY_CXX_MODULE])
+ AC_SUBST([NDK_BUILD_SO_LDFLAGS])
AC_SUBST([NDK_BUILD_CFLAGS])
AC_SUBST([NDK_BUILD_READELF])
diff --git a/src/conf_post.h b/src/conf_post.h
index f2353803074..53e1cb56e74 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -475,3 +475,15 @@ extern int emacs_setenv_TZ (char const *);
/* Emacs does not need glibc strftime behavior for AM and PM
indicators. */
#define REQUIRE_GNUISH_STRFTIME_AM_PM false
+
+#if defined __ANDROID_API__ && __ANDROID_API__ < 35
+/* Persuade lib/time.h to include the system's time.h, then... */
+#define __need_time_t
+#include
+#undef __need_time_t
+
+/* ... redefine timezone_t to an Emacs-specific type, so that Gnulib's
+ replacement may not conflict with the OS type uselessly defined when
+ __ANDROID_API__ < 35. */
+#define timezone_t rpl_timezone_t
+#endif /* __ANDROID_API__ && __ANDROID_API__ < 35 */