1 /*
   2  * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /**
  27  * Gets the most recent android platform installed, relative to the given path.
  28  * The path will either be ANDROID_SDK or ANDROID_NDK
  29  * TODO Shouldn't we instead just ask people to point to the one they want to use?
  30  *
  31  * @param path The path to the Android SDK or NDK
  32  * @return The name of the most recent platform
  33  */
  34 String getLatestPlatform(String path) {
  35     def max = 0
  36     file(cygpath("$path/platforms")).eachFile() {file->
  37         def pname = file.getName() - "android-"
  38         def ptf = pname?.isInteger() ? pname.toInteger() : 0
  39         if (max < ptf) {
  40             max = ptf
  41         }
  42     }
  43     if (max == 0) {
  44         return null;
  45     }
  46     return "android-" + max
  47 }
  48 
  49 int compareVersions(String s1, String s2) {
  50     def v1t = s1.tokenize(".")
  51     def v2t = s2.tokenize(".")
  52     for(int i = 0; i < v1t.size(); i++) {
  53         if (i == v2t.size()) {
  54             return 1
  55         }
  56         int n1 = v1t[i].isInteger() ? v1t[i].toInteger() : 0
  57         int n2 = v2t[i].isInteger() ? v2t[i].toInteger() : 0
  58         if (n1 == n2) {
  59             continue
  60         } else if (n1 > n2) {
  61             return 1;
  62         } else {
  63             return -1
  64         }
  65     }
  66     return (v2t.size() > v1t.size()) ? -1 : 0
  67 }
  68 
  69 String getLatestToolchain(String ndk, String tch) {
  70     def max = "0.0"
  71     def matchFile = null
  72     file(cygpath("$ndk/toolchains")).eachFile() {file->
  73         def filename = file.getName()
  74         if (filename.startsWith(tch)) {
  75             def p = filename - "$tch-"
  76             if (compareVersions(p, max) > 0) {
  77                 max = p
  78                 matchFile = file
  79             }
  80         }
  81     }
  82     return matchFile.getAbsolutePath()
  83 }
  84 
  85 boolean assertDir(File dir) {
  86     return dir != null && dir.exists() && dir.isDirectory() && dir.canRead();
  87 }
  88 
  89 boolean assertDir(String dir) {
  90     return assertDir(file(dir))
  91 }
  92 
  93 def closedDir = file("$projectDir/../rt-closed")
  94 
  95 def toolchainArchs = ["arm-linux-androideabi", "mipsel-linux-android", "x86"]
  96 def armArchs = ["armeabi", "armeabiv-7a"]
  97 
  98 ANDROID = [:]
  99 ANDROID.compileSwing = false;
 100 ANDROID.compileSWT = false;
 101 ANDROID.glassPlatform = "android"
 102 ANDROID.armArch = armArchs[0]
 103 ANDROID.libDest = "lib"
 104 ANDROID.jfxdvklib = "jfxdvk.jar"
 105 ANDROID.library = { name -> return "lib${name}.so" as String }
 106 
 107 def sdk = project.hasProperty("ANDROID_SDK") ? "${ANDROID_SDK}" : null;
 108 def ndk = project.hasProperty("ANDROID_NDK") ? "${ANDROID_NDK}" : null;
 109 ANDROID.canBuild = sdk != null && ndk != null
 110 if (!ANDROID.canBuild) {
 111     fail("Can't build Android. Path to SDK or NDK was not set or is invalid!")
 112 }
 113 
 114 ANDROID.canBuild = assertDir(sdk) && assertDir(ndk)
 115 if (!ANDROID.canBuild) {
 116     if (!assertDir(sdk)) {
 117         logger.error("Path to ANDROID_SDK is invalid! [$sdk]")
 118     }
 119     if (!assertDir(ndk)) {
 120         logger.error("Path to ANDROID_NDK is invalid! [$ndk]")
 121     }
 122     fail("Cannot build, missing android tools")
 123 }
 124 
 125 def sdk_target = project.hasProperty("ANDROID_SDK_TARGET") ?  "${ANDROID_SDK_TARGET}" : getLatestPlatform(sdk);
 126 if (!assertDir(file("$sdk/platforms/$sdk_target"))) {
 127     sdk_target = getLatestPlatform(sdk);
 128     logger.warn("Redefine ANDROID_SDK_TARGET to: [$sdk_target]")
 129 }
 130 
 131 def ndk_target = project.hasProperty("ANDROID_NDK_TARGET") ? "${ANDROID_NDK_TARGET}" : getLatestPlatform(ndk);
 132 if (!assertDir(file("$ndk/platforms/$ndk_target"))) {
 133     ndk_target = getLatestPlatform(ndk);
 134     logger.warn("Redefine ANDROID_NDK_TARGET to: [$ndk_target]")
 135 }
 136 
 137 ANDROID.canBuild = sdk_target != null && ndk_target != null
 138 if (!ANDROID.canBuild) {
 139     fail("Can't determine sdk or ndk target platform!")
 140 }
 141 
 142 def toolchainHome = project.hasProperty("ANDROID_CROSS_TOOLS_VER") ?
 143     "$ndk/toolchains/${ANDROID_CROSS_TOOLS_VER}" : getLatestToolchain(ndk, toolchainArchs[0])
 144 if (!assertDir(toolchainHome)) {
 145     toolchainHome = getLatestToolchain(ndk, toolchainArchs[0])
 146     logger.warn("Redefine toolchain to [$toolchainHome]")
 147 }
 148 
 149 // Look for the the Android SDK & NDK to use, as well as the compiler stuff
 150 def compilerHome = null
 151 file("$toolchainHome/prebuilt").eachDir() {subdir ->
 152     compilerHome = subdir.getAbsolutePath()
 153     return
 154 }
 155 
 156 ANDROID.canBuild = compilerHome != null
 157 if (!ANDROID.canBuild) {
 158     fail("Failed to access toolchain [$toolchainHome/prebuilt/$toolsPlatform]!")
 159 }
 160 
 161 def freetypeDir = project.hasProperty("FREETYPE_DIR") ? "${FREETYPE_DIR}" : null
 162 if (!assertDir(freetypeDir)) {
 163     logger.warn("FREETYPE_DIR $freetypeDir doesn't exists! Build continues without native text support.")
 164     freetypeDir = null
 165 }
 166 def compileNativeText = freetypeDir != null
 167 
 168 def compiler = file("$compilerHome/bin/${toolchainArchs[0]}-gcc").getAbsolutePath()
 169 def linker = file("$compilerHome/bin/${toolchainArchs[0]}-g++").getAbsolutePath()
 170 
 171 // Log the settings we're building with
 172 logger.quiet("ANDROID_SDK: $sdk")
 173 logger.quiet("ANDROID_SDK_TARGET: $sdk_target")
 174 logger.quiet("ANDROID_NDK: $ndk")
 175 logger.quiet("ANDROID_NDK_TARGET: $ndk_target")
 176 logger.quiet("FREETYPE_DIR: $freetypeDir")
 177 logger.quiet("Compile native text: $compileNativeText")
 178 logger.quiet("Android Compiler: $compiler")
 179 logger.quiet("Android Linker: $linker")
 180 
 181 project(":graphics") {
 182 
 183     task compileDalvikLibs(type: JavaCompile, group: "Build") {
 184         description = "Task compiles dalvik vm based libraries."
 185         sourceCompatibility = JavaVersion.VERSION_1_6
 186         targetCompatibility = JavaVersion.VERSION_1_6
 187         options.bootClasspath = "$sdk/platforms/$sdk_target/android.jar"
 188         classpath = files("build/classes/android")
 189         destinationDir = file("build/classes/android")
 190         dependencyCacheDir = file("build/dependency-cache")
 191         source fileTree(dir: 'src/android/java').matching { include 'com/oracle/dalvik/**' }
 192     }
 193 
 194     task jarDalvikLibs(type: Jar, group: "Build", dependsOn: compileDalvikLibs) {
 195         description = "Creates jfxdvk.jar with all dalvik based classes."
 196         archiveName = "jfxdvk.jar"
 197         includeEmptyDirs = false
 198         from("build/classes/android")
 199         include("com/oracle/dalvik/**/*")
 200         dependsOn(compileDalvikLibs)
 201     }
 202 
 203     afterEvaluate {
 204         addNative(project, "surface", ["android"])
 205         addNative(project, "vmlauncher", ["android"])
 206         if (compileNativeText) {
 207             addNative(project, "fontNativeFreetype", ["android"])
 208         }
 209         tasks["javahAndroidVmlauncher"].dependsOn(compileDalvikLibs)
 210         tasks["native"].dependsOn("nativeSurface", "nativeVmlauncher")
 211         if (compileNativeText) {
 212             tasks["native"].dependsOn("nativeFontNativeFreetype")
 213         }
 214 
 215         sdkAndroid  {
 216             dependsOn(jarDalvikLibs)
 217             doLast {
 218                 def props = project.ext["ANDROID"]
 219                 copy {
 220                     from(
 221                          "${project("graphics").buildDir}/libs/vmlauncher/android/${props.library(props.vmlauncher.lib)}",
 222                          "${project("graphics").buildDir}/libs/surface/android/${props.library(props.surface.lib)}"
 223                     )
 224                     into ("build/android-sdk/dalvik/${props.libDest}")
 225                 }
 226                 copy {
 227                     from ("${project("graphics").buildDir}/libs/${props.jfxdvklib}")
 228                     into ("build/android-sdk/dalvik/lib")
 229                 }
 230                 if (compileNativeText) {
 231                     copy {
 232                         from ("${project("graphics").buildDir}/libs/fontNativeFreetype/android")
 233                         into ("build/android-sdk/$ANDROID.libDest")
 234                     }
 235                 }
 236             }
 237         }
 238     }
 239 }
 240 
 241 project(":controls") {
 242     afterEvaluate {
 243         task compileControlsJavaAndroid(type: JavaCompile, group: "Build", dependsOn: [":graphics:compileJava", ":controls:compileJava"]) {
 244             description = "Task compiles controls for Android"
 245             classpath = files("${project("base").buildDir}/classes/main",
 246                 "${project("graphics").buildDir}/classes/main",
 247                 "${project("controls").buildDir}/classes/main"
 248             )
 249             destinationDir = file("${project("controls").buildDir}/classes/android")
 250             dependencyCacheDir = file("${project("controls").buildDir}/dependency-cache")
 251             source file("${project("controls").projectDir}/src/android/java")
 252         }
 253 
 254        task processControlsResourcesAndroid() {
 255            copy {
 256                from ("${project("controls").projectDir}/src/android/resources")
 257                into ("${project("controls").buildDir}/resources/android")
 258            }
 259         }
 260 
 261         sdkAndroid {
 262             dependsOn(compileControlsJavaAndroid, processControlsResourcesAndroid)
 263         }
 264     }
 265 }
 266 
 267 project(":web") {
 268     apply plugin: 'java'
 269 
 270     compileJava {
 271         enabled = false
 272     }
 273 
 274     afterEvaluate {
 275         if (!BUILD_CLOSED) {
 276             logger.warn("OpenJFX build. Skipping webkit build on Android.")
 277             return
 278         }
 279         def compileWebJavaAndroid = task("compileWebJavaAndroid",
 280             type: JavaCompile, group: "Build") {
 281 
 282             dependsOn(project(":graphics").classes, project(":base").classes)
 283             description = "Task compiles web component for Android."
 284             classpath = files(
 285                 project(":controls").sourceSets.main.java.outputDir,
 286                 project(":graphics").sourceSets.main.java.outputDir,
 287                 project(":base").sourceSets.main.java.outputDir
 288             )
 289             destinationDir = file("${project("web").buildDir}/classes/android")
 290             dependencyCacheDir = file("${project("web").buildDir}/dependency-cache")
 291             source file("${project("web").projectDir}/src/android/java")
 292         }
 293 
 294         def jarWebJavaAndroid = task("jarWebJavaAndroid",
 295             type: Jar, group: "Build") {
 296             description = "Creates web.jar for Android."
 297             dependsOn(compileWebJavaAndroid)
 298             archiveName = "web.jar"
 299             includeEmptyDirs = false
 300             destinationDir = project.file("build/libs/android")
 301             from("build/classes/android")
 302         }
 303 
 304         addNative(project, "webview", ["android"])
 305         addNative(project, "dvkwebview", ["android"])
 306         javahAndroidWebview.dependsOn(compileWebJavaAndroid)
 307         javahAndroidDvkwebview.dependsOn(compileWebJavaAndroid)
 308 
 309         jfxrtAndroid {
 310             from "${project("web").buildDir}/classes/android"
 311         }
 312 
 313         sdkAndroid  {
 314             dependsOn(jarWebJavaAndroid)
 315             doLast {
 316                 def props = project.ext["ANDROID"]
 317                 copy {
 318                     from(
 319                          "${project("web").buildDir}/libs/dvkwebview/android/${props.library(props.dvkwebview.lib)}"
 320                     )
 321                     into ("build/android-sdk/dalvik/${props.libDest}")
 322                 }
 323                 copy {
 324                     from ("${project("web").buildDir}/libs/webview/android/${props.library(props.webview.lib)}")
 325                     into ("build/android-sdk/${props.libDest}")
 326                 }
 327             }
 328         }
 329     }
 330 }
 331 
 332 
 333 ANDROID.jfxrtJarExcludes = [
 334     "**/*.hlsl",
 335     "com/sun/glass/ui/win",
 336     "com/sun/prism/d3d",
 337     "com/sun/prism/es2/gl/win",
 338     "com/sun/prism/null3d",
 339     "com/sun/scenario/effect/impl/hw/d3d",
 340     "com/sun/glass/events/mac",
 341     "com/sun/glass/ui/mac",
 342     "com/sun/prism/es2/gl/mac",
 343     "com/sun/glass/ui/gtk",
 344     "com/sun/glass/ui/ios",
 345     "com/sun/prism/es2/gl/eglx11",
 346     "com/sun/prism/es2/gl/x11",
 347     "com/sun/glass/ui/swt", // SWT glass
 348     "javafx/embed/swing", // Swing Interop
 349     "javafx/embed/swt", // SWT Interop
 350     "com/oracle/dalvik"
 351 ]
 352 
 353 def text = (compileNativeText) ? "native" : ""
 354 
 355 ANDROID.javafxPlatformProperties = """
 356 javafx.platform=android
 357 android.glass.platform=Lens
 358 android.glass.lens=eglfb
 359 android.prism.glDepthSize=16
 360 android.prism.lcdtext=false
 361 android.prism.debugfonts=true
 362 android.prism.text=$text
 363 android.embedded=eglfb
 364 android.prism.allowhidpi=false
 365 android.prism.maxTextureSize=2048
 366 android.prism.dirtyopts=true
 367 android.prism.vsync=false
 368 android.log.lens=FINE
 369 android.use.egl=true
 370 android.com.sun.javafx.isEmbedded=true
 371 """
 372 def sysroot = "$ndk/platforms/$ndk_target/arch-arm"
 373 
 374 def ccFlags = ["--sysroot=$sysroot","-std=c99", "-DANDROID", "-c", "-nostdlib",
 375                "-DANDROID_NDK"]
 376 
 377 if (project.hasProperty("DALVIK_VM")) {
 378     ccFlags += ["-DDALVIK_VM"]
 379 }
 380 
 381 def ccOptFlags = ["-fpic", "-ffunction-sections", "-funwind-tables","-fstack-protector",
 382                   "-Os", "-O2", "-fno-strict-aliasing", "-finline-limit=64", "-fomit-frame-pointer"]
 383 def ccWarnFlags = ["-Wa,--noexecstack", "-Wno-psabi"]
 384 def ccArchFlags = ["-mthumb", "-msoft-float", "-D__ARM_ARCH_5__", "-D__ARM_ARCH_5T__", "-D__ARM_ARCH_5E__",
 385                    "-D__ARM_ARCH_5TE__", "-march=armv5te" , "-mtune=xscale"]
 386 def ccDebugFlags = [IS_DEBUG_NATIVE ? "-DDEBUG" : "-DNDEBUG"]
 387 def ccDefaultIncludeFlags = ["-I$ndk/platforms/$ndk_target/arch-arm/usr/include"]
 388 
 389 def linkFlags = ["--sysroot=$sysroot",
 390                  "-Wl,--no-undefined", "-Wl,-z,noexecstack", "-lc", "-lm", "-shared",
 391                  "-L$ndk/platforms/$ndk_target/arch-arm/usr/lib"]
 392 
 393 
 394 ANDROID.vmlauncher = [:]
 395 ANDROID.vmlauncher.classpath = files("$sdk/platforms/$sdk_target/android.jar",
 396                                      "${project("graphics").buildDir}/classes/android")
 397 
 398 ANDROID.vmlauncher.javahSource = files("${project("graphics").buildDir}/classes/android")
 399 ANDROID.vmlauncher.javahClasspath = files("${project("graphics").buildDir}/classes/android",
 400                                           "$sdk/platforms/$sdk_target/android.jar")
 401 ANDROID.vmlauncher.javahInclude = [
 402     "com/oracle/dalvik/*"
 403 ]
 404 ANDROID.vmlauncher.nativeSource = [
 405     file("${project("graphics").projectDir}/src/android/native/VMLauncher.c"),
 406     file("${project("graphics").projectDir}/src/android/native/NativePipeReader.c"),
 407     file("${project("graphics").projectDir}/src/android/native/DalvikProxySelector.c")
 408 ]
 409 ANDROID.vmlauncher.compiler = compiler
 410 ANDROID.vmlauncher.linker = linker
 411 ANDROID.vmlauncher.lib = "vmlauncher"
 412 ANDROID.vmlauncher.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 413     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 414 ANDROID.vmlauncher.linkFlags = [linkFlags, "-llog"].flatten()
 415 
 416 ANDROID.surface = [:]
 417 ANDROID.surface.javahInclude = [
 418     "com/sun/glass/events/*",
 419     "com/sun/glass/ui/android/*"
 420 ]
 421 ANDROID.surface.nativeSource = [
 422     file("${project("graphics").projectDir}/src/main/native-glass/lens/android")
 423 ]
 424 ANDROID.surface.compiler = compiler
 425 ANDROID.surface.linker = linker
 426 ANDROID.surface.lib = "glass_lens_android"
 427 ANDROID.surface.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 428     ccDebugFlags, ccDefaultIncludeFlags, "-Isrc/main/native-glass/lens"].flatten()
 429 ANDROID.surface.linkFlags = [linkFlags, "-ldl", "-landroid", "-llog"].flatten()
 430 
 431 ANDROID.webview = [:]
 432 ANDROID.webview.javahSource = files("${project("web").buildDir}/classes/android")
 433 ANDROID.webview.javahClasspath = files("${project("web").buildDir}/classes/android")
 434 ANDROID.webview.javahInclude = [
 435     "com/sun/webkit/NativeWebView.class"
 436 ]
 437 ANDROID.webview.nativeSource = [
 438     file("${project("web").projectDir}/src/android/native/native_webview.c")
 439 ]
 440 ANDROID.webview.compiler = compiler
 441 ANDROID.webview.linker = linker
 442 ANDROID.webview.lib = "webview"
 443 ANDROID.webview.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 444     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 445 ANDROID.webview.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()
 446 
 447 ANDROID.dvkwebview = [:]
 448 ANDROID.dvkwebview.javahSource = files("${project("web").buildDir}/classes/android")
 449 ANDROID.dvkwebview.javahClasspath = files("${project("web").buildDir}/classes/android")
 450 ANDROID.dvkwebview.javahInclude = [
 451     "com/sun/webkit/NativeWebView.class"
 452 ]
 453 ANDROID.dvkwebview.nativeSource = [
 454     file("${project("web").projectDir}/src/android/native/android_webview.c")
 455 ]
 456 ANDROID.dvkwebview.compiler = compiler
 457 ANDROID.dvkwebview.linker = linker
 458 ANDROID.dvkwebview.lib = "android_webview"
 459 ANDROID.dvkwebview.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 460     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 461 ANDROID.dvkwebview.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()
 462 
 463 ANDROID.glass = [:]
 464 ANDROID.glass.variants = ["eglfb", "lensport"]
 465 ANDROID.glass.javahInclude = [
 466     "com/sun/glass/events/**",
 467     "com/sun/glass/ui/*",
 468     "com/sun/glass/ui/android/*",
 469     "com/sun/glass/ui/lens/*"]
 470 
 471 ANDROID.glass.lensport = [:]
 472 ANDROID.glass.lensport.nativeSource = [
 473     file("${project("graphics").projectDir}/src/main/native-glass/lens/lensport"),
 474     file("${project("graphics").projectDir}/src/main/native-glass/lens/lensport/initPlatform.c"),
 475     file("${project("graphics").projectDir}/src/main/native-glass/lens/lensport/wrapped_functions.c")
 476 ]
 477 ANDROID.glass.lensport.compiler = compiler
 478 ANDROID.glass.lensport.linker = linker
 479 ANDROID.glass.lensport.lib = "lens_porting"
 480 ANDROID.glass.lensport.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 481     ccDebugFlags, ccDefaultIncludeFlags, "-DISEGLFB", "-DLENSPORT",
 482     "-I", file("${project("graphics").projectDir}/src/main/native-glass/lens")].flatten()
 483 ANDROID.glass.lensport.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()
 484 
 485 ANDROID.glass.eglfb = [:]
 486 ANDROID.glass.eglfb.nativeSource = [
 487     file("${project("graphics").projectDir}/src/main/native-glass/lens"),
 488     file("${project("graphics").projectDir}/src/main/native-glass/lens/wm"),
 489     file("${project("graphics").projectDir}/src/main/native-glass/lens/cursor/nullCursor"),
 490     file("${project("graphics").projectDir}/src/main/native-glass/lens/input/android"),
 491     file("${project("graphics").projectDir}/src/main/native-glass/lens/wm/screen/androidScreen.c")
 492 ]
 493 ANDROID.glass.eglfb.compiler = compiler
 494 ANDROID.glass.eglfb.linker = linker
 495 ANDROID.glass.eglfb.lib = "glass_lens_eglfb"
 496 ANDROID.glass.eglfb.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 497     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 498 ANDROID.glass.eglfb.linkFlags = [linkFlags, "-ldl", "-landroid", "-llog"].flatten()
 499 
 500 ANDROID.prism = [:]
 501 ANDROID.prism.javahInclude = ["com/sun/prism/impl/**/*", "com/sun/prism/PresentableState*"]
 502 ANDROID.prism.nativeSource = file("${project("graphics").projectDir}/src/main/native-prism")
 503 ANDROID.prism.compiler = compiler
 504 ANDROID.prism.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 505     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 506 ANDROID.prism.linker = linker
 507 ANDROID.prism.linkFlags = [linkFlags].flatten()
 508 ANDROID.prism.lib = "prism_common"
 509 
 510 ANDROID.prismSW = [:]
 511 ANDROID.prismSW.javahInclude = ["com/sun/pisces/**/*"]
 512 ANDROID.prismSW.nativeSource = file("${project("graphics").projectDir}/src/main/native-prism-sw")
 513 ANDROID.prismSW.compiler = compiler
 514 ANDROID.prismSW.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 515     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 516 ANDROID.prismSW.linker = linker
 517 ANDROID.prismSW.linkFlags = [linkFlags].flatten()
 518 ANDROID.prismSW.lib = "prism_sw"
 519 
 520 ANDROID.decora = [:]
 521 ANDROID.decora.compiler = compiler
 522 ANDROID.decora.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 523     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 524 ANDROID.decora.linker = linker
 525 ANDROID.decora.linkFlags = [linkFlags].flatten()
 526 ANDROID.decora.lib = "decora_sse"
 527 
 528 ANDROID.iio = [:]
 529 ANDROID.iio.javahInclude = ["com/sun/javafx/iio/**/*"]
 530 ANDROID.iio.nativeSource = [
 531     file("${project("graphics").projectDir}/src/main/native-iio"),
 532     file("${project("graphics").projectDir}/src/main/native-iio/libjpeg7")]
 533 ANDROID.iio.compiler = compiler
 534 ANDROID.iio.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 535     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 536 ANDROID.iio.linker = linker
 537 ANDROID.iio.linkFlags = [linkFlags].flatten()
 538 ANDROID.iio.lib = "javafx_iio"
 539 
 540 ANDROID.prismES2 = [:]
 541 ANDROID.prismES2.variants = ["eglfb"]
 542 ANDROID.prismES2.javahInclude = ["com/sun/prism/es2/**/*"]
 543 
 544 ANDROID.prismES2.eglfb = [:]
 545 ANDROID.prismES2.eglfb.nativeSource = [
 546     file("${project("graphics").projectDir}/src/main/native-prism-es2"),
 547     file("${project("graphics").projectDir}/src/main/native-prism-es2/GL"),
 548     file("${project("graphics").projectDir}/src/main/native-prism-es2/eglfb")]
 549 ANDROID.prismES2.eglfb.compiler = compiler
 550 ANDROID.prismES2.eglfb.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 551     ccDebugFlags, ccDefaultIncludeFlags, "-DIS_EGLFB"].flatten()
 552 ANDROID.prismES2.eglfb.linker = linker
 553 ANDROID.prismES2.eglfb.linkFlags = [linkFlags, "-ldl", "-llog", "-lGLESv2", "-lEGL"].flatten()
 554 ANDROID.prismES2.eglfb.lib = "prism_es2_eglfb"
 555 
 556 ANDROID.font = [:]
 557 ANDROID.font.javahInclude = [
 558         "com/sun/javafx/font/**/*",
 559         "com/sun/javafx/text/**/*"]
 560 ANDROID.font.nativeSource = [file("$closedDir/javafx-font-native/src")]
 561 ANDROID.font.compiler = compiler
 562 ANDROID.font.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 563     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 564 ANDROID.font.linker = linker
 565 ANDROID.font.linkFlags = [linkFlags].flatten()
 566 ANDROID.font.lib = "javafx_font"
 567 
 568 if (compileNativeText) {
 569     ANDROID.fontNativeFreetype = [:]
 570     ANDROID.fontNativeFreetype.javahInclude = [
 571         "com/sun/javafx/font/freetype/OSFreetype.class"
 572     ]
 573     ANDROID.fontNativeFreetype.nativeSource = [
 574         file("${project("graphics").projectDir}/src/main/native-font/freetype.c")
 575     ]
 576     ANDROID.fontNativeFreetype.compiler = compiler
 577     ANDROID.fontNativeFreetype.linker = linker
 578     ANDROID.fontNativeFreetype.lib = "javafx_font_freetype"
 579 
 580     ccFlags += ["-D_ENABLE_HARFBUZZ"]
 581 
 582     ANDROID.fontNativeFreetype.ccFlags =
 583         [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 584         ccDebugFlags, ccDefaultIncludeFlags,
 585         "-I$freetypeDir/include", "-I$freetypeDir/include/freetype2"].flatten()
 586 
 587     ANDROID.fontNativeFreetype.linkFlags =
 588         [linkFlags, "-llog",
 589          "-L$freetypeDir/lib", "$freetypeDir/lib/libfreetype.a"].flatten()
 590 }
 591 
 592 ANDROID.media = [:]
 593 ANDROID.media.compiler = compiler
 594 ANDROID.media.linker = linker
 595 ANDROID.media.lib = file("$compilerHome/bin/${toolchainArchs[0]}-ar").getAbsolutePath()