+ # Use the most recent build_tools_version
+ var android_home = "ANDROID_HOME".environ
+ if android_home.is_empty then android_home = "HOME".environ / "Android/Sdk"
+ var build_tools_dir = android_home / "build-tools"
+ var available_versions = build_tools_dir.files
+
+ var build_tools_version
+ if available_versions.is_empty then
+ print_error "Error: found no Android build-tools, install one or set ANDROID_HOME."
+ return
+ else
+ alpha_comparator.sort available_versions
+ build_tools_version = available_versions.last
+ end
+
+ # Gather ldflags for Android
+ var ldflags = new Array[String]
+ var platform_name = "android"
+ for mmodule in compiler.mainmodule.in_importation.greaters do
+ if mmodule.ldflags.keys.has(platform_name) then
+ ldflags.add_all mmodule.ldflags[platform_name]
+ end
+ end
+
+ # Platform version for OpenGL ES
+ var platform_version = ""
+ if ldflags.has("-lGLESv3") then
+ platform_version = "def platformVersion = 18"
+ else if ldflags.has("-lGLESv2") then
+ platform_version = "def platformVersion = 12"
+ end
+
+ # TODO make configurable client-side
+ var compile_sdk_version = app_target_api
+
+ var local_build_gradle = """
+apply plugin: 'com.android.application'
+
+{{{platform_version}}}
+
+android {
+ compileSdkVersion {{{compile_sdk_version}}}
+ buildToolsVersion "{{{build_tools_version}}}"
+
+ defaultConfig {
+ applicationId "{{{app_package}}}"
+ minSdkVersion {{{app_min_api}}}
+ {{{app_max_api}}}
+ targetSdkVersion {{{app_target_api}}}
+ versionCode {{{project.version_code}}}
+ versionName "{{{app_version}}}"
+ ndk {
+ abiFilters 'armeabi-v7a', 'x86'
+ }
+ externalNativeBuild {
+ cmake {
+ arguments "-DANDROID_TOOLCHAIN=gcc"
+ }
+ }
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ externalNativeBuild {
+ cmake {
+ path "src/main/cpp/CMakeLists.txt"
+ }
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+}
+"""
+ local_build_gradle.write_to_file "{android_project_root}/app/build.gradle"
+
+ # TODO add 'arm64-v8a' and 'x86_64' to `abiFilters` when the min API is available
+
+ # ---
+ # Other, smaller files
+
+ # /build.gradle
+ var global_build_gradle = """
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.0.0'
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+"""
+ global_build_gradle.write_to_file "{android_project_root}/build.gradle"
+
+ # /settings.gradle
+ var settings_gradle = """
+include ':app'
+"""
+ settings_gradle.write_to_file "{android_project_root}/settings.gradle"
+
+ # /gradle.properties
+ var gradle_properties = """
+org.gradle.jvmargs=-Xmx1536m
+"""
+ gradle_properties.write_to_file "{android_project_root}/gradle.properties"
+
+ # Insert an importation of the generated R class to all Java files from the FFI
+ for mod in compiler.mainmodule.in_importation.greaters do
+ var java_ffi_file = mod.java_file
+ if java_ffi_file != null then java_ffi_file.add "import {app_package}.R;"
+ end