diff -Naurp Python-2.7.15.orig/configure.ac Python-2.7.15/configure.ac
--- Python-2.7.15.orig/configure.ac	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/configure.ac	2018-07-05 17:44:50.500985727 +0200
@@ -1790,7 +1790,7 @@ fi
 # structures (such as rlimit64) without declaring them. As a
 # work-around, disable LFS on such configurations
 
-use_lfs=yes
+use_lfs=no
 AC_MSG_CHECKING(Solaris LFS bug)
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #define _LARGEFILE_SOURCE 1
diff -Naurp Python-2.7.15.orig/Modules/mmapmodule.c Python-2.7.15/Modules/mmapmodule.c
--- Python-2.7.15.orig/Modules/mmapmodule.c	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/mmapmodule.c	2018-07-05 16:18:40.953035027 +0200
@@ -78,6 +78,12 @@ my_getpagesize(void)
 #  define MAP_ANONYMOUS MAP_ANON
 #endif
 
+//PMPP API<21
+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+    extern void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
+#endif
+//PMPP API<21
+
 static PyObject *mmap_module_error;
 
 typedef enum
diff -Naurp Python-2.7.15.orig/Modules/posixmodule.c Python-2.7.15/Modules/posixmodule.c
--- Python-2.7.15.orig/Modules/posixmodule.c	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/posixmodule.c	2018-07-05 16:20:48.933033807 +0200
@@ -9477,6 +9477,12 @@ all_ins(PyObject *d)
 #define MODNAME "posix"
 #endif
 
+//PMPP API<21
+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+    extern ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
+#endif
+//PMPP API<21
+
 PyMODINIT_FUNC
 INITFUNC(void)
 {
diff -Naurp Python-2.7.15.orig/Modules/signalmodule.c Python-2.7.15/Modules/signalmodule.c
--- Python-2.7.15.orig/Modules/signalmodule.c	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/signalmodule.c	2018-07-05 16:40:46.601022385 +0200
@@ -32,6 +32,13 @@
 #include <process.h>
 #endif
 
+//PMPP API<21
+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+    #define SIGRTMIN 32
+    #define SIGRTMAX _NSIG
+#endif
+//PMPP API<21
+
 #ifndef NSIG
 # if defined(_NSIG)
 #  define NSIG _NSIG            /* For BSD/SysV */
diff -Naurp Python-2.7.15.orig/Modules/termios.c Python-2.7.15/Modules/termios.c
--- Python-2.7.15.orig/Modules/termios.c	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/termios.c	2018-07-05 16:43:16.457020956 +0200
@@ -357,7 +357,11 @@ static struct constant {
 #endif
 
     /* tcsetattr() constants */
+#if defined(__ANDROID_API__) && __ANDROID_API__ > 0
+    {"TCSANOW", TCSETS},     // https://github.com/android-ndk/ndk/issues/441
+#else
     {"TCSANOW", TCSANOW},
+#endif
     {"TCSADRAIN", TCSADRAIN},
     {"TCSAFLUSH", TCSAFLUSH},
 #ifdef TCSASOFT
diff -Naurp Python-2.7.15.orig/Objects/obmalloc.c Python-2.7.15/Objects/obmalloc.c
--- Python-2.7.15.orig/Objects/obmalloc.c	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Objects/obmalloc.c	2018-07-05 16:52:27.577015700 +0200
@@ -1,5 +1,11 @@
 #include "Python.h"
 
+//PMPP API<21
+#if __ANDROID_API__ < 21
+    extern void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
+#endif
+//PMPP API<21
+
 #if defined(__has_feature)  /* Clang */
  #if __has_feature(address_sanitizer)  /* is ASAN enabled? */
   #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \
###############################################################
######### ANDROID LOCALE PATCHES FOR ANDROID API < 21 #########
###############################################################
--- Python-2.7.15.orig/Modules/_localemodule.c	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/_localemodule.c	2018-07-05 16:39:08.241023323 +0200
@@ -170,6 +170,12 @@ PyLocale_setlocale(PyObject* self, PyObj
         PyErr_SetString(Error, "invalid locale category");
         return NULL;
     }
+#else
+    #ifdef __ANDROID__
+        #if defined(__ANDROID_API__) && __ANDROID_API__ < 20
+            return PyUnicode_FromFormat("%s", "C");
+        #endif
+    #endif
 #endif

     if (locale) {
@@ -215,7 +221,15 @@ PyLocale_localeconv(PyObject* self)
         return NULL;

     /* if LC_NUMERIC is different in the C library, use saved value */
-    l = localeconv();
+    //PMPP API<21
+    #if defined(__ANDROID_API__) && __ANDROID_API__ < 21
+        /* Don't even try on Android's broken locale.h. */
+        goto failed;
+    #else
+         /* if LC_NUMERIC is different in the C library, use saved value */
+         l = localeconv(); //PATCHED
+    #endif
+    //PMPP API<21

     /* hopefully, the localeconv result survives the C library calls
        involved herein */
@@ -215,7 +215,11 @@ PyLocale_localeconv(PyObject* self)
         return NULL;

     /* if LC_NUMERIC is different in the C library, use saved value */
+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
     l = localeconv();
+#else
+    decimal_point = ".";
+#endif

     /* hopefully, the localeconv result survives the C library calls
        involved herein */
--- Python-2.7.15/Objects/stringlib/formatter.h.orig	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Objects/stringlib/formatter.h	2018-12-26 11:37:08.771315390 +0100
@@ -640,11 +640,17 @@ get_locale_info(int type, LocaleInfo *lo
 {
     switch (type) {
     case LT_CURRENT_LOCALE: {
+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in
+   the STL. locale.h header has stubs for localeconv() method, but the library
+   doesn't implement it. The closest Android SDK that implement localeconv()
+   is SDK 21*/
         struct lconv *locale_data = localeconv();
         locale_info->decimal_point = locale_data->decimal_point;
         locale_info->thousands_sep = locale_data->thousands_sep;
         locale_info->grouping = locale_data->grouping;
         break;
+#endif
     }
     case LT_DEFAULT_LOCALE:
         locale_info->decimal_point = ".";
--- Python-2.7.15/Objects/stringlib/localeutil.h.orig	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Objects/stringlib/localeutil.h	2018-12-26 11:38:10.003314806 +0100
@@ -202,9 +202,18 @@ _Py_InsertThousandsGroupingLocale(STRING
                                   Py_ssize_t n_digits,
                                   Py_ssize_t min_width)
 {
+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in
+   the STL. locale.h header has stubs for localeconv() method, but the library
+   doesn't implement it. The closest Android SDK that implement localeconv()
+   is SDK 21*/
         struct lconv *locale_data = localeconv();
         const char *grouping = locale_data->grouping;
         const char *thousands_sep = locale_data->thousands_sep;
+#else
+        const char *grouping = "\3\0";
+        const char *thousands_sep = ",";
+#endif

         return _Py_InsertThousandsGrouping(buffer, n_buffer, digits, n_digits,
                                            min_width, grouping, thousands_sep);
--- Python-2.7.15/Python/pystrtod.c.orig	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Python/pystrtod.c	2018-12-26 11:47:54.723309229 +0100
@@ -126,7 +126,13 @@ _PyOS_ascii_strtod(const char *nptr, cha
 {
     char *fail_pos;
     double val = -1.0;
+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in
+   the STL. locale.h header has stubs for localeconv() method, but the library
+   doesn't implement it. The closest Android SDK that implement localeconv()
+   is SDK 21*/
     struct lconv *locale_data;
+#endif
     const char *decimal_point;
     size_t decimal_point_len;
     const char *p, *decimal_point_pos;
@@ -138,8 +144,16 @@ _PyOS_ascii_strtod(const char *nptr, cha

     fail_pos = NULL;

+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in
+   the STL. locale.h header has stubs for localeconv() method, but the library
+   doesn't implement it. The closest Android SDK that implement localeconv()
+   is SDK 21*/
     locale_data = localeconv();
     decimal_point = locale_data->decimal_point;
+#else
+    decimal_point = ".";
+#endif
     decimal_point_len = strlen(decimal_point);
 
     assert(decimal_point_len != 0);
@@ -375,8 +389,16 @@ PyOS_string_to_double(const char *s,
 Py_LOCAL_INLINE(void)
 change_decimal_from_locale_to_dot(char* buffer)
 {
+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21
+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in
+   the STL. locale.h header has stubs for localeconv() method, but the library
+   doesn't implement it. The closest Android SDK that implement localeconv()
+   is SDK 21*/
     struct lconv *locale_data = localeconv();
     const char *decimal_point = locale_data->decimal_point;
+#else
+    decimal_point = ".";
+#endif

     if (decimal_point[0] != '.' || decimal_point[1] != 0) {
         size_t decimal_point_len = strlen(decimal_point);