From: Jean Privat Date: Sat, 21 Feb 2015 06:05:02 +0000 (+0700) Subject: Merge: Support Android on 2 different ARMs, x86 and even MIPS X-Git-Tag: v0.7.2~11 X-Git-Url: http://nitlanguage.org?hp=31ade8fa569ee0d49b948aa6157d1f984f7ed435 Merge: Support Android on 2 different ARMs, x86 and even MIPS Tested on ARM v7 and x86. MIPS on Android is more rare but it is used on some low-cost phones. Each extra architecture use less than 1 mo in the release APK, but MIPS is the largest one. I could add an annotation or something else if we ever need smaller APK files. Mineit VR release with the 4 architectures and its textures takes only 2.5 mo. Pull-Request: #1164 Reviewed-by: Jean Privat --- diff --git a/share/libgc/android-setup-libgc.sh b/share/libgc/android-setup-libgc.sh index 8e20ca0..ea04856 100755 --- a/share/libgc/android-setup-libgc.sh +++ b/share/libgc/android-setup-libgc.sh @@ -34,18 +34,6 @@ if test -z "$ANDROID_NDK"; then ANDROID_NDK=`dirname $ndk_build_path` fi -# Get the first platform available (it shouldn't change much, but it may -# have to be adjusted) -for platform in `echo $ANDROID_NDK/platforms/android-*/arch-arm`; do - SYS_ROOT=$platform - break -done - -if test -z "$SYS_ROOT"; then - echo "Error: could not an Android platform in the NDK, define ANDROID_NDK to the correct path." - exit 1 -fi - # Information on the currently targeted libgc and libatomic_ops source URL # These may have to be updated according to server-side changes and newer # versions of the Boehm GC. @@ -82,17 +70,42 @@ mv $libatomic_ops_dir $libgc_dir/libatomic_ops || exit 1 cd $libgc_dir || exit 1 -# Configure for Android -path="$ANDROID_NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/" -export CC="$path/arm-linux-androideabi-gcc --sysroot=$SYS_ROOT" -export CXX="$path/arm-linux-androideabi-g++ --sysroot=$SYS_ROOT" -export LD="$path/arm-linux-androideabi-ld" -export AR="$path/arm-linux-androideabi-ar" -export RANLIB="$path/arm-linux-androideabi-ranlib" -export STRIP="$path/arm-linux-androideabi-strip" -export CFLAGS="-DIGNORE_DYNAMIC_LOADING -DPLATFORM_ANDROID -I libatomic_ops/src/" -export LIBS="-lc -lgcc" -./configure --host=arm-linux-androideabi --enable-static --disable-shared --prefix="$install" || exit 1 - -# Compile and install locally -make install -j 4 || exit 1 +archs=( arm x86 mips) +tools_dirs=( arm-linux-androideabi-4.6 x86-4.6 mipsel-linux-android-4.6) +tools_prefixes=(arm-linux-androideabi i686-linux-android mipsel-linux-android) +hosts=( arm-linux-androideabi x86-linux-android mips-linux-android) + +n_archs=$(( ${#archs[@]} - 1 )) +for i in $(eval echo "{0..$n_archs}"); do + arch=${archs[i]} + tools_dir=${tools_dirs[i]} + tools_prefix=${tools_prefixes[i]} + host=${hosts[i]} + + # Get the first platform available (it shouldn't change much, but it may + # have to be adjusted) + for platform in `echo $ANDROID_NDK/platforms/android-*/arch-$arch`; do + sys_root=$platform + break + done + + if test -z "$sys_root"; then + echo "Error: could not an Android platform for $arch in the NDK, define ANDROID_NDK to the correct path." + exit 1 + fi + + # Configure for Android + path="$ANDROID_NDK/toolchains/$tools_dir/prebuilt/linux-x86_64/bin/" + export CC="$path/$tools_prefix-gcc --sysroot=$sys_root" + export CXX="$path/$tools_prefix-g++ --sysroot=$sys_root" + export LD="$path/$tools_prefix-ld" + export AR="$path/$tools_prefix-ar" + export RANLIB="$path/$tools_prefix-ranlib" + export STRIP="$path/$tools_prefix-strip" + export CFLAGS="-DIGNORE_DYNAMIC_LOADING -DPLATFORM_ANDROID -I libatomic_ops/src/" + export LIBS="-lc -lgcc" + ./configure --host=$host --enable-static --disable-shared --prefix="$install/$arch/" || exit 1 + + # Compile and install locally + make install -j 4 || exit 1 +done diff --git a/src/platform/android.nit b/src/platform/android.nit index f4b04a6..c04bd28 100644 --- a/src/platform/android.nit +++ b/src/platform/android.nit @@ -140,11 +140,17 @@ class AndroidToolchain end end - ## Generate delegating makefile + ## Generate Application.mk dir = "{android_project_root}/jni/" """ +APP_ABI := armeabi armeabi-v7a x86 mips +APP_PLATFORM := android-{{{app_target_api}}} +""".write_to_file "{dir}/Application.mk" + + ## Generate delegating makefile + """ include $(call all-subdir-makefiles) - """.write_to_file("{dir}/Android.mk") +""".write_to_file "{dir}/Android.mk" # Gather ldflags for Android var ldflags = new Array[String] @@ -165,7 +171,7 @@ LOCAL_CFLAGS := -D ANDROID -D WITH_LIBGC LOCAL_MODULE := main LOCAL_SRC_FILES := \\ {{{cfiles.join(" \\\n")}}} -LOCAL_LDLIBS := {{{ldflags.join(" ")}}} libgc.a +LOCAL_LDLIBS := {{{ldflags.join(" ")}}} $(TARGET_ARCH)/libgc.a LOCAL_STATIC_LIBRARIES := android_native_app_glue png include $(BUILD_SHARED_LIBRARY) @@ -236,13 +242,20 @@ $(call import-module,android/native_app_glue) end # Ensure that android-setup-libgc.sh has been executed - if not "{share_dir}/libgc/lib".file_exists then + if not "{share_dir}/libgc/arm/lib".file_exists then toolcontext.exec_and_check(["{share_dir}/libgc/android-setup-libgc.sh"], "Android project error") end # Copy GC files - toolcontext.exec_and_check(["cp", "{share_dir}/libgc/lib/libgc.a", "{android_project_root}/libgc.a"], "Android project error") - toolcontext.exec_and_check(["ln", "-s", "{share_dir}/libgc/include/gc/", "{android_project_root}/jni/nit_compile/gc"], "Android project error") + for arch in ["arm", "x86", "mips"] do + dir = android_project_root/arch + dir.mkdir + toolcontext.exec_and_check(["cp", "{share_dir}/libgc/{arch}/lib/libgc.a", + dir/"libgc.a"], "Android project error") + end + + toolcontext.exec_and_check(["ln", "-s", "{share_dir}/libgc/arm/include/gc/", + "{android_project_root}/jni/nit_compile/gc"], "Android project error") ### Link to assets (for mnit and others) # This will be accessed from `android_project_root` @@ -285,7 +298,7 @@ $(call import-module,android/native_app_glue) """ {{{app_name}}} -""".write_to_file "{dir}/res/values/strings.xml" +""".write_to_file "{android_project_root}/res/values/strings.xml" end # Android libs folder