diff --git a/ci/docker/arm-linux-androideabi/accept-licenses.sh b/ci/android-accept-licenses.sh
similarity index 100%
rename from ci/docker/arm-linux-androideabi/accept-licenses.sh
rename to ci/android-accept-licenses.sh
diff --git a/ci/docker/arm-linux-androideabi/install-ndk.sh b/ci/android-install-ndk.sh
similarity index 81%
rename from ci/docker/arm-linux-androideabi/install-ndk.sh
rename to ci/android-install-ndk.sh
index 566a3191848a3bc5736e07fe566ad6726bd1e5a7..75bcd20f2f77d19a6253a94fbbf2657e359358eb 100644
--- a/ci/docker/arm-linux-androideabi/install-ndk.sh
+++ b/ci/android-install-ndk.sh
@@ -13,9 +13,24 @@ set -ex
 
 curl -O https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip
 unzip -q android-ndk-r13b-linux-x86_64.zip
+
+case "$1" in
+  aarch64)
+    arch=arm64
+    ;;
+
+  i686)
+    arch=x86
+    ;;
+
+  *)
+    arch=$1
+    ;;
+esac;
+
 android-ndk-r13b/build/tools/make_standalone_toolchain.py \
-        --install-dir /android/ndk-arm \
-        --arch arm \
+        --install-dir /android/ndk-$1 \
+        --arch $arch \
         --api 24
 
 rm -rf ./android-ndk-r13b-linux-x86_64.zip ./android-ndk-r13b
diff --git a/ci/docker/arm-linux-androideabi/install-sdk.sh b/ci/android-install-sdk.sh
similarity index 61%
rename from ci/docker/arm-linux-androideabi/install-sdk.sh
rename to ci/android-install-sdk.sh
index 3f20837fe061afb104c04f9a0619b9d679d03e14..0762dcb45d0b710799b2efb8096320c3618ea47c 100644
--- a/ci/docker/arm-linux-androideabi/install-sdk.sh
+++ b/ci/android-install-sdk.sh
@@ -19,15 +19,35 @@ set -ex
 # which apparently magically accepts the licenses.
 
 mkdir sdk
-curl https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz | \
-    tar xzf - -C sdk --strip-components=1
+curl https://dl.google.com/android/repository/tools_r25.2.5-linux.zip -O
+unzip -d sdk tools_r25.2.5-linux.zip
 
-filter="platform-tools,android-21"
-filter="$filter,sys-img-armeabi-v7a-android-21"
+filter="platform-tools,android-24"
 
-./accept-licenses.sh "android - update sdk -a --no-ui --filter $filter"
+case "$1" in
+  arm | armv7)
+    abi=armeabi-v7a
+    ;;
+
+  aarch64)
+    abi=arm64-v8a
+    ;;
+
+  i686)
+    abi=x86
+    ;;
+
+  *)
+    echo "invalid arch: $1"
+    exit 1
+    ;;
+esac;
+
+filter="$filter,sys-img-$abi-android-24"
+
+./android-accept-licenses.sh "android - update sdk -a --no-ui --filter $filter"
 
 echo "no" | android create avd \
-                --name arm-21 \
-                --target android-21 \
-                --abi armeabi-v7a
+                --name $1 \
+                --target android-24 \
+                --abi $abi
diff --git a/ci/docker/aarch64-linux-android/Dockerfile b/ci/docker/aarch64-linux-android/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..7ad84926bf82b2106223640759135558cbf6dff0
--- /dev/null
+++ b/ci/docker/aarch64-linux-android/Dockerfile
@@ -0,0 +1,32 @@
+FROM ubuntu:16.04
+
+RUN dpkg --add-architecture i386 && \
+    apt-get update && \
+    apt-get install -y --no-install-recommends \
+  file \
+  curl \
+  ca-certificates \
+  python \
+  unzip \
+  expect \
+  openjdk-9-jre \
+  libstdc++6:i386 \
+  libpulse0 \
+  gcc \
+  libc6-dev
+
+WORKDIR /android/
+COPY android* /android/
+
+ENV ANDROID_ARCH=aarch64
+ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools
+
+RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
+RUN sh /android/android-install-sdk.sh $ANDROID_ARCH
+RUN mv /root/.android /tmp
+RUN chmod 777 -R /tmp/.android
+RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/*
+
+ENV PATH=$PATH:/rust/bin \
+    CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android-gcc \
+    HOME=/tmp
diff --git a/ci/docker/arm-linux-androideabi/Dockerfile b/ci/docker/arm-linux-androideabi/Dockerfile
index 1911fbd87970ea2e5ced4f2121373bf1e1cedea8..054941416dfb501ebe7363740205a3bf64599ee0 100644
--- a/ci/docker/arm-linux-androideabi/Dockerfile
+++ b/ci/docker/arm-linux-androideabi/Dockerfile
@@ -11,24 +11,22 @@ RUN dpkg --add-architecture i386 && \
   expect \
   openjdk-9-jre \
   libstdc++6:i386 \
+  libpulse0 \
   gcc \
   libc6-dev
 
 WORKDIR /android/
+COPY android* /android/
 
-COPY install-ndk.sh /android/
-RUN sh /android/install-ndk.sh
+ENV ANDROID_ARCH=arm
+ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools
 
-ENV PATH=$PATH:/android/ndk-arm/bin:/android/sdk/tools:/android/sdk/platform-tools
-
-COPY install-sdk.sh accept-licenses.sh /android/
-RUN sh /android/install-sdk.sh
+RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
+RUN sh /android/android-install-sdk.sh $ANDROID_ARCH
+RUN mv /root/.android /tmp
+RUN chmod 777 -R /tmp/.android
+RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/*
 
 ENV PATH=$PATH:/rust/bin \
     CARGO_TARGET_ARM_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \
-    ANDROID_EMULATOR_FORCE_32BIT=1 \
     HOME=/tmp
-RUN chmod 755 /android/sdk/tools/*
-
-RUN cp -r /root/.android /tmp
-RUN chmod 777 -R /tmp/.android
diff --git a/ci/docker/i686-linux-android/Dockerfile b/ci/docker/i686-linux-android/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..bee904379645f7c32f52414189a412f3dbe7c8ba
--- /dev/null
+++ b/ci/docker/i686-linux-android/Dockerfile
@@ -0,0 +1,32 @@
+FROM ubuntu:16.04
+
+RUN dpkg --add-architecture i386 && \
+    apt-get update && \
+    apt-get install -y --no-install-recommends \
+  file \
+  curl \
+  ca-certificates \
+  python \
+  unzip \
+  expect \
+  openjdk-9-jre \
+  libstdc++6:i386 \
+  libpulse0 \
+  gcc \
+  libc6-dev
+
+WORKDIR /android/
+COPY android* /android/
+
+ENV ANDROID_ARCH=i686
+ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools
+
+RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
+RUN sh /android/android-install-sdk.sh $ANDROID_ARCH
+RUN mv /root/.android /tmp
+RUN chmod 777 -R /tmp/.android
+RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/*
+
+ENV PATH=$PATH:/rust/bin \
+    CARGO_TARGET_I686_LINUX_ANDROID_LINKER=i686-linux-android-gcc \
+    HOME=/tmp
diff --git a/ci/run-docker.sh b/ci/run-docker.sh
index a7702ae1dc51282229327c2fe377df23cceba8a7..1ac419a349c0865bff5268ca022b8b95d02cb2a9 100644
--- a/ci/run-docker.sh
+++ b/ci/run-docker.sh
@@ -5,7 +5,8 @@ set -ex
 
 run() {
     echo $1
-    docker build -t libc ci/docker/$1
+    # use -f so we can use ci/ as build context
+    docker build -t libc -f ci/docker/$1/Dockerfile ci/
     mkdir -p target
     docker run \
       --user `id -u`:`id -g` \
diff --git a/ci/run.sh b/ci/run.sh
index d33af30fd91c716122970c76467cabca8fafee3f..1b6e0fb1d4549cf86594b666151da2fd032cf6cc 100755
--- a/ci/run.sh
+++ b/ci/run.sh
@@ -105,11 +105,16 @@ case "$TARGET" in
 esac
 
 case "$TARGET" in
-  arm-linux-androideabi)
-    emulator @arm-21 -no-window &
+  arm-linux-androideabi | aarch64-linux-android | i686-linux-android)
+    # set SHELL so android can detect a 64bits system, see
+    # http://stackoverflow.com/a/41789144
+    # https://issues.jenkins-ci.org/browse/JENKINS-26930?focusedCommentId=230791&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-230791
+    export SHELL=/bin/dash
+    arch=$(echo $TARGET | cut -d- -f1)
+    emulator @$arch -no-window -no-accel &
     adb wait-for-device
-    adb push $CARGO_TARGET_DIR/$TARGET/debug/libc-test /data/libc-test
-    adb shell /data/libc-test 2>&1 | tee /tmp/out
+    adb push $CARGO_TARGET_DIR/$TARGET/debug/libc-test /data/local/tmp/libc-test
+    adb shell /data/local/tmp/libc-test 2>&1 | tee /tmp/out
     grep "^PASSED .* tests" /tmp/out
     ;;