Source codes taken from:

https://www.python.org/downloads/release/python-374/
https://github.com/libffi/libffi/releases

No changes to the original source code were done. 

Homepage of the PYTHON project:

https://www.python.org/

Homepage of the LIBFFI project:

https://sourceware.org/libffi/

License (Python): please see the files LICENSE-PYTHON.txt and LICENSING_TERMS-PYTHON.txt
License (libffi): please see the file LICENSE-PYTHON-LIBFFI.txt
License (Crystax NDK): please see the file LICENSE-CRYSTAX_NDK.txt

Compilation:

(0) prepare the standalone Crystax-NDK toolchain 
    (download from https://www.crystax.net/en/download) inside of
    Cygwin with preinstalled packages gcc, gfortran, make, clang, autoconf, python3.7;
./make-standalone-toolchain.sh --ndk-dir=/cygdrive/c/crystax-ndk-10.3.2 --arch=arm --abis=armeabi-v7a --platform=android-21 --system=windows-x86_64 --install-dir=/home/arm
    export the appropriate paths to PATH
    e.g. C:\cygwin\home\arm\bin
(1) extract the libffi sources, run Cygwin, type:
./configure --build=i686-pc-cygwin --target=arm-linux --host=arm-linux CC=armv7a-linux-androideabi21-clang CXX=armv7a-linux-androideabi21-clang++ AR=arm-linux-androideabi-ar RANLIB=arm-linux-androideabi-ranlib
make
    the resulting library libffi.a is created inside of the .libs directory
(2) extract the Python sources, modify the file Modules/Setup, check if all the necessary
    modules are (un)marked (#), add _ctypes to Setup.local (see the attached changed files);
    modify the file Modules/timemodule.c (line 495)
#ifdef ANDROID
#else
#ifndef HAVE_TIMEGM
static time_t
timegm(struct tm *p)
{
    /* XXX: the following implementation will not work for tm_year < 1970.
       but it is likely that platforms that don't have timegm do not support
       negative timestamps anyways. */
    return p->tm_sec + p->tm_min*60 + p->tm_hour*3600 + p->tm_yday*86400 +
        (p->tm_year-70)*31536000 + ((p->tm_year-69)/4)*86400 -
        ((p->tm_year-1)/100)*86400 + ((p->tm_year+299)/400)*86400;
}
#endif
#endif
    and the file Python/sysmodule.c (line 2224)
#ifdef ANDROID
#else
#ifdef MULTIARCH
    value = PyUnicode_FromString(MULTIARCH);
    if (value == NULL)
        goto error;
    res = PyDict_SetItemString(impl_info, "_multiarch", value);
    Py_DECREF(value);
    if (res < 0)
        goto error;
#endif
#endif
(3) create folder libffi inside of the Python source directory, save there the previously compiled
    library libffi.a for the required architecture
    (or change the path in Setup.local)
(4) create file named config.site and add other settings there
(5) run Cygwin, open the working folder with Python sources, type:
export ARCH="arm"   
export CC="arm-linux-androideabi-gcc"  
export CXX="arm-linux-androideabi-g++"  
export AR="arm-linux-androideabi-ar"  
export RANLIB="arm-linux-androideabi-ranlib"  
export STRIP="arm-linux-androideabi-strip --strip-unneeded"  
export READELF="arm-linux-androideabi-readelf"  
export MAKE="make -j4 CROSS_COMPILE_TARGET=yes"  
export CONFIG_SITE="config.site" 
./configure CFLAGS="-pie" CPPFLAGS="-DANDROID -D__ANDROID_API__=21" LDFLAGS=-pie --host=arm-linux-androideabi --build=i686-pc-cygwin --prefix="/home/install/python374_21_pie.arm" --disable-ipv6  
vytvori se makefile
make
make install

Note: you can think up another installation directory, however, it is necessary to formulate
it in Cygwin-compatible form, i.e. --prefix="/home/..." but not --prefix="/cygdrive/c/cygwin/home/..."

The resulting binaries are designed to be run in terminal environment under Android 4.4 or lower
in presence of the library libcrystax.so (part of Crystax-NDK) - it has to be added to LD_LIBRARY_PATH
before execution of Python, e.g.:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/folder/in/which/library/libcrystax.so/is.