1 /*
   2  * Copyright (c) 2014, 2017, 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 /**
  28  * Gets the most recent android platform installed, relative to the given path.
  29  * The path will either be ANDROID_SDK or ANDROID_NDK
  30  * TODO Shouldn't we instead just ask people to point to the one they want to use?
  31  *
  32  * @param path The path to the Android SDK or NDK
  33  * @return The name of the most recent platform
  34  */
  35 String getLatestPlatform(String path) {
  36     def max = 0
  37     println("$path")
  38     file(cygpath("$path/platforms")).eachFile() {file->
  39         def pname = file.getName() - "android-"
  40         def ptf = pname?.isInteger() ? pname.toInteger() : 0
  41         if (max < ptf) {
  42             max = ptf
  43         }
  44     }
  45     if (max == 0) {
  46         return null;
  47     }
  48     return "android-" + max
  49 }
  50 
  51 int compareVersions(String s1, String s2) {
  52     def v1t = s1.tokenize(".")
  53     def v2t = s2.tokenize(".")
  54     for(int i = 0; i < v1t.size(); i++) {
  55         if (i == v2t.size()) {
  56             return 1
  57         }
  58         int n1 = v1t[i].isInteger() ? v1t[i].toInteger() : 0
  59         int n2 = v2t[i].isInteger() ? v2t[i].toInteger() : 0
  60         if (n1 == n2) {
  61             continue
  62         } else if (n1 > n2) {
  63             return 1;
  64         } else {
  65             return -1
  66         }
  67     }
  68     return (v2t.size() > v1t.size()) ? -1 : 0
  69 }
  70 
  71 String getLatestToolchain(String ndk, String tch) {
  72     def max = "0.0"
  73     def matchFile = null
  74     file(cygpath("$ndk/toolchains")).eachFile() {file->
  75         def filename = file.getName()
  76         if (filename.startsWith(tch)) {
  77             def p = filename - "$tch-"
  78             if (compareVersions(p, max) > 0) {
  79                 max = p
  80                 matchFile = file
  81             }
  82         }
  83     }
  84     return matchFile.getAbsolutePath()
  85 }
  86 
  87 boolean assertDir(File dir) {
  88     return dir != null && dir.exists() && dir.isDirectory() && dir.canRead();
  89 }
  90 
  91 boolean assertDir(String dir) {
  92     return assertDir(file(dir))
  93 }
  94 
  95 def closedDir = file("$projectDir/../rt-closed")
  96 
  97 def toolchainArchs = ["arm-linux-androideabi", "mipsel-linux-android", "x86"]
  98 def armArchs = ["armeabi", "armeabiv-7a"]
  99 
 100 ext.DALVIK = [:]
 101 DALVIK.compileSwing = false;
 102 DALVIK.compileSWT = false;
 103 DALVIK.compileFXPackager = false;
 104 DALVIK.compileDesignTime = false;
 105 DALVIK.glassPlatform = "android"
 106 DALVIK.armArch = armArchs[0]
 107 DALVIK.libDest = "lib"
 108 DALVIK.jfxdvklib = "jfxdvk.jar"
 109 DALVIK.library = { name -> return "lib${name}.so" as String }
 110 DALVIK.includeMonocole = true
 111 DALVIK.includeLens = false
 112 
 113 def sdk = project.hasProperty("ANDROID_SDK") ? "${ANDROID_SDK}" : null;
 114 def ndk = project.hasProperty("ANDROID_NDK") ? "${ANDROID_NDK}" : null;
 115 DALVIK.canBuild = sdk != null && ndk != null
 116 if (!DALVIK.canBuild) {
 117     logger.error("Can't build Android. Path to SDK or NDK was not set or is invalid!")
 118     return;
 119 }
 120 
 121 DALVIK.canBuild = assertDir(sdk) && assertDir(ndk)
 122 if (!DALVIK.canBuild) {
 123     if (!assertDir(sdk)) {
 124         logger.error("Path to ANDROID_SDK is invalid! [$sdk]")
 125     }
 126     if (!assertDir(ndk)) {
 127         logger.error("Path to ANDROID_NDK is invalid! [$ndk]")
 128     }
 129     return
 130 }
 131 
 132 def sdk_target = project.hasProperty("ANDROID_SDK_TARGET") ?  "${ANDROID_SDK_TARGET}" : getLatestPlatform(sdk);
 133 if (!assertDir(file("$sdk/platforms/$sdk_target"))) {
 134     sdk_target = getLatestPlatform(sdk);
 135     logger.warn("Redefine ANDROID_SDK_TARGET to: [$sdk_target]")
 136 }
 137 
 138 def ndk_target = project.hasProperty("ANDROID_NDK_TARGET") ? "${ANDROID_NDK_TARGET}" : getLatestPlatform(ndk);
 139 if (!assertDir(file("$ndk/platforms/$ndk_target"))) {
 140     ndk_target = getLatestPlatform(ndk);
 141     logger.warn("Redefine ANDROID_NDK_TARGET to: [$ndk_target]")
 142 }
 143 
 144 DALVIK.canBuild = sdk_target != null && ndk_target != null
 145 if (!DALVIK.canBuild) {
 146     logger.error("Can't determine sdk or ndk target platform!")
 147     return
 148 }
 149 
 150 def toolchainHome = project.hasProperty("ANDROID_CROSS_TOOLS_VER") ?
 151     "$ndk/toolchains/${ANDROID_CROSS_TOOLS_VER}" : getLatestToolchain(ndk, toolchainArchs[0])
 152 if (!assertDir(toolchainHome)) {
 153     toolchainHome = getLatestToolchain(ndk, toolchainArchs[0])
 154     logger.warn("Redefine toolchain to [$toolchainHome]")
 155 }
 156 
 157 // Look for the the Android SDK & NDK to use, as well as the compiler stuff
 158 def compilerHome = null
 159 file("$toolchainHome/prebuilt").eachDir() {subdir ->
 160     compilerHome = subdir.getAbsolutePath()
 161     return
 162 }
 163 
 164 DALVIK.canBuild = compilerHome != null
 165 if (!DALVIK.canBuild) {
 166     logger.error("Failed to access toolchain [$toolchainHome/prebuilt/$toolsPlatform]!")
 167     return
 168 }
 169 
 170 def freetypeDir = project.hasProperty("FREETYPE_DIR") ? "${FREETYPE_DIR}" : null
 171 if (!assertDir(freetypeDir)) {
 172     logger.warn("FREETYPE_DIR $freetypeDir doesn't exists! Build continues without native text support.")
 173     freetypeDir = null
 174 }
 175 def compileNativeText = freetypeDir != null
 176 
 177 def compiler = file("$compilerHome/bin/${toolchainArchs[0]}-gcc").getAbsolutePath()
 178 def linker = file("$compilerHome/bin/${toolchainArchs[0]}-g++").getAbsolutePath()
 179 
 180 // Log the settings we're building with
 181 logger.quiet("ANDROID_SDK: $sdk")
 182 logger.quiet("ANDROID_SDK_TARGET: $sdk_target")
 183 logger.quiet("ANDROID_NDK: $ndk")
 184 logger.quiet("ANDROID_NDK_TARGET: $ndk_target")
 185 logger.quiet("FREETYPE_DIR: $freetypeDir")
 186 logger.quiet("Compile native text: $compileNativeText")
 187 logger.quiet("Android Compiler: $compiler")
 188 logger.quiet("Android Linker: $linker")
 189 
 190 //exclude from build
 191 project(":swing") {
 192     apply plugin: 'java'
 193 
 194     compileJava {
 195         enabled = false
 196     }
 197 }
 198 
 199 project(":fxml") {
 200     apply plugin: 'java'
 201 
 202     jar.dependsOn("retroClass");
 203 
 204     compileJava {
 205         enabled = true
 206     }
 207 }
 208 
 209 allprojects() {
 210     repositories {
 211         mavenCentral()
 212     }
 213     configurations {
 214         retroconfig
 215     }
 216 
 217     dependencies {
 218         retroconfig 'net.orfjackal.retrolambda:retrolambda:1.1.4'
 219     }
 220     task retroClass() <<{
 221             file classdirs = file ("$buildDir/classes");
 222             lf = classdirs.listFiles();
 223             classdirs.eachDir{t ->
 224                 javaexec {
 225                     inputdir = t
 226                     basecp = files(lf, "${project("base").buildDir}/classes/main", "${project("graphics").buildDir}/classes/main", "${project("controls").buildDir}/classes/main").asPath
 227                     myconfig = configurations.retroconfig;
 228                     lambdaloc = myconfig.resolve().toArray()[0];
 229                     classpath = configurations.retroconfig
 230                     main = 'net.orfjackal.retrolambda.Main'
 231                     jvmArgs = [
 232                                "-Xbootclasspath:$JDK_HOME/jre/lib/rt.jar",
 233                                 "-Dretrolambda.inputDir=$inputdir",
 234                                 "-Dretrolambda.classpath=$basecp",
 235                                 "-Dretrolambda.bytecodeVersion=51",
 236                                 "-javaagent:$lambdaloc"
 237                    ]
 238             }
 239         }
 240     }
 241 }
 242 
 243 
 244 project(":base") {
 245     apply plugin: 'java'
 246     jar.dependsOn("retroClass");
 247 }
 248 
 249 project(":web") {
 250     apply plugin: 'java'
 251     jar.dependsOn("retroClass");
 252     compileJava.dependsOn(":graphics:assemble");
 253     sourceSets.main.java.srcDirs = ['src/android/java'];
 254     sourceSets {
 255         main {
 256             java {
 257                 srcDirs= ['src/android/java']
 258             }
 259         }
 260     }
 261     dependencies {
 262          compile files("../graphics/build/classes/dalvik");
 263     }
 264 
 265     afterEvaluate {
 266     sourceSets.main.java.srcDirs = ['src/android/java'];
 267         def compileWebJavaAndroid = task("compileWebJavaAndroid",
 268             type: JavaCompile, group: "Build") {
 269 
 270             dependsOn(project(":graphics").classes, project(":base").classes)
 271             description = "Task compiles web component for Android."
 272             classpath = files(
 273                 project(":controls").sourceSets.main.java.outputDir,
 274                 project(":graphics").sourceSets.main.java.outputDir,
 275                 project(":base").sourceSets.main.java.outputDir,
 276                 "${project("graphics").buildDir}/classes/dalvik"
 277             )
 278             destinationDir = file("${project("web").buildDir}/classes/android")
 279             dependencyCacheDir = file("${project("web").buildDir}/dependency-cache")
 280             source file("${project("web").projectDir}/src/android/java")
 281         }
 282 
 283         def jarWebJavaAndroid = task("jarWebJavaAndroid",
 284             type: Jar, group: "Build") {
 285             description = "Creates web.jar for Android."
 286             dependsOn(compileWebJavaAndroid)
 287             archiveName = "web.jar"
 288             includeEmptyDirs = false
 289             destinationDir = project.file("build/libs/android")
 290             from("build/classes/android")
 291         }
 292         addNative(project, "webview")
 293         // addNative(project, "dvkwebview")
 294         javahDalvikWebview.dependsOn(compileWebJavaAndroid)
 295         // javahDalvikDvkwebview.dependsOn(compileWebJavaAndroid)
 296 
 297         jfxrtDalvik {
 298             from "${project("web").buildDir}/classes/android"
 299         }
 300 
 301   sdkDalvik  {
 302             dependsOn(jarWebJavaAndroid)
 303             doLast {
 304                 def props = project.ext["DALVIK"]
 305                 copy {
 306                     from ("${project("web").buildDir}/libs/webview/dalvik/${props.library(props.webview.lib)}")
 307                     into ("build/dalvik-sdk/${props.libDest}")
 308                 }
 309             }
 310         }
 311     }
 312 
 313 
 314     jar.dependsOn("retroClass");
 315 }
 316 
 317 project(":media") {
 318     apply plugin: 'java'
 319     jar.dependsOn("retroClass");
 320 }
 321 
 322 
 323 project(":graphics") {
 324 
 325     apply plugin: 'java'
 326 
 327     sourceSets.main.java {
 328         exclude "com/sun/glass/ui/swt/**"
 329     }
 330 
 331     assemble.dependsOn("retroClass");
 332     task compileDalvikLibs(type: JavaCompile, group: "Build") {
 333         description = "Task compiles dalvik vm based libraries."
 334         options.bootClasspath = "$sdk/platforms/$sdk_target/android.jar"
 335         classpath = files("build/classes/dalvik", "build/classes/main")
 336         destinationDir = file("build/classes/dalvik")
 337         dependencyCacheDir = file("build/dependency-cache")
 338         source fileTree(dir: 'src/dalvik/java').matching { include '**' }
 339     }
 340 
 341     task jarDalvikLibs(type: Jar, group: "Build", dependsOn: compileDalvikLibs) {
 342         description = "Creates jfxdvk.jar with all dalvik based classes."
 343         archiveName = "jfxdvk.jar"
 344         includeEmptyDirs = false
 345         from("build/classes/dalvik")
 346         include("javafxports/**/*")
 347         include("com/oracle/**/*")
 348         dependsOn(compileDalvikLibs)
 349     }
 350 
 351     jarDalvikLibs {
 352         eachFile {
 353                 if (it.name.endsWith('.class')) {
 354                     RandomAccessFile raf = new RandomAccessFile(it.file.path, "rw");
 355                     raf.seek(7);
 356                     raf.writeByte(0x32); //make it jdk6
 357                     raf.close();
 358                 }
 359             }
 360     }
 361 
 362     afterEvaluate {
 363         addNative(project, "activity")
 364         if (compileNativeText) {
 365             addNative(project, "fontNativeFreetype")
 366         }
 367         tasks["javahDalvikGlass"].dependsOn(compileDalvikLibs)
 368         tasks["javahDalvikActivity"].dependsOn(compileDalvikLibs)
 369         tasks["native"].dependsOn("nativeActivity")
 370         if (compileNativeText) {
 371             tasks["native"].dependsOn("nativeFontNativeFreetype")
 372         }
 373         tasks["javahDalvikPrismSW"].enabled = false
 374         tasks["ccDalvikPrismSW"].enabled = false;
 375         tasks["linkDalvikPrismSW"].enabled = false;
 376 
 377         sdkDalvik  {
 378             dependsOn(jarDalvikLibs)
 379             doLast {
 380                 def props = project.ext["DALVIK"]
 381                 copy {
 382                     from(
 383                          "${project("graphics").buildDir}/libs/activity/dalvik/${props.library(props.activity.lib)}"
 384                     )
 385                     into ("build/dalvik-sdk/${props.libDest}")
 386                 }
 387                 copy {
 388                     from ("${project("graphics").buildDir}/libs/${props.jfxdvklib}")
 389                     into ("build/dalvik-sdk/lib")
 390                 }
 391 /*
 392                 copy {
 393                     from ("${project("compat").buildDir}/libs/compat.jar")
 394                     into ("build/dalvik-sdk/lib")
 395                 }
 396 */
 397                 if (compileNativeText) {
 398                     copy {
 399                         from ("${project("graphics").buildDir}/libs/fontNativeFreetype/dalvik")
 400                         into ("build/dalvik-sdk/${props.libDest}")
 401                     }
 402                 }
 403             }
 404         }
 405     }
 406 }
 407 
 408 project(":controls") {
 409 
 410     apply plugin: 'java'
 411 /*
 412     compileJava {
 413          options.bootClasspath="/home/johan/open-jfx/bitbucket/8u-dev-build/compat/build/libs/compat-1.0.0.jar:$sdk/platforms/$sdk_target/android.jar"
 414      }
 415 */
 416 
 417 
 418     sourceSets.main.java.srcDir('src/android/java')
 419 /*
 420     sourceSets.main.java {
 421         exclude 'javafx/scene/control/Date*.java'
 422         exclude 'com/sun/javafx/scene/control/skin/Date*.java'
 423         exclude 'com/sun/javafx/scene/control/behavior/Date*.java'
 424     }
 425 */
 426     task copyResources() << {
 427         copy {
 428             from ("src/android/resources")
 429             into ("build/resources/dalvik")
 430         }
 431     }
 432 
 433     assemble.dependsOn("copyResources","retroClass");
 434 
 435     afterEvaluate {
 436 
 437         jfxrtDalvik {
 438             from ("${project("controls").buildDir}/classes/dalvik",
 439                   "${project("controls").buildDir}/resources/dalvik")
 440         }
 441 
 442     }
 443 }
 444 
 445 allprojects {
 446     afterEvaluate {
 447         sdkDalvik {
 448             doLast {
 449                 ant.jar(update: "true", destfile: "build/dalvik-sdk/lib/jfxrt.jar",
 450                     basedir: "build/dalvik-sdk/lib", includes: "*.properties")
 451             }
 452         }
 453     }
 454 }
 455 
 456 
 457 DALVIK.jfxrtJarExcludes = [
 458     "**/*.hlsl",
 459     "com/sun/glass/ui/win",
 460     "com/sun/glass/ui/accessible/win",
 461     "com/sun/prism/j2d",
 462     "com/sun/prism/sw",
 463     "com/sun/glass/ui/accessible/mac",
 464     "com/sun/glass/ui/ios",
 465     "com/sun/glass/ui/swt", // SWT glass
 466     "com/oracle/dalvik",
 467     // "javafx/scene/media", //exclude all media for now
 468     // "com/sun/media",
 469     // "com/sun/javafx/media",
 470     "com/sun/javafx/font/directwrite", //exclude non freetype font support
 471     "com/sun/javafx/font/coretext",
 472     "com/sun/javafx/font/freetype/Pango*",
 473     "com/sun/javafx/font/freetype/OSPango*",
 474     // "com/sun/webkit",   //exclude all WebView for now
 475     // "com/sun/javafx/webkit",
 476     // "com/sun/javafx/scene/web",
 477     // "javafx/scene/web",
 478     // "com/sun/javafx/sg/prism/NGWeb*",
 479     // "com/sun/javafx/sg/prism/web*",
 480     "javafx/print", //exclude printing
 481     "com/sun/javafx/print",
 482     "com/sun/javafx/tk/Print*"
 483 ]
 484 
 485 def text = (compileNativeText) ? "native" : ""
 486 
 487 DALVIK.javafxPlatformProperties = """
 488 javafx.platform=android
 489 android.javax.xml.stream.XMLInputFactory=com.sun.xml.stream.ZephyrParserFactory
 490 android.javax.xml.stream.XMLOutputFactory=com.sun.xml.stream.ZephyrWriterFactory
 491 android.javax.xml.stream.XMLEventFactory=com.sun.xml.stream.events.ZephyrEventFactory
 492 android.glass.platform=Monocle
 493 android.glass.lens=eglfb
 494 android.log.lens=FINEST
 495 android.prism.verbose=true
 496 DALVIK.prism.verbose=true
 497 android.prism.glDepthSize=16
 498 android.prism.lcdtext=false
 499 android.prism.debugfonts=true
 500 android.prism.text=$text
 501 android.embedded=monocle
 502 android.prism.allowhidpi=true
 503 android.prism.maxTextureSize=2048
 504 android.prism.dirtyopts=true
 505 android.prism.vsync=false
 506 android.use.egl=true
 507 android.com.sun.javafx.isEmbedded=true
 508 com.sun.javafx.gestures.zoom=true
 509 com.sun.javafx.gestures.rotate=true
 510 com.sun.javafx.gestures.scroll=true
 511 """
 512 def sysroot = "$ndk/platforms/$ndk_target/arch-arm"
 513 
 514 def ccFlags = ["--sysroot=$sysroot","-std=c99", "-DANDROID", "-c", "-nostdlib",
 515                "-DANDROID_NDK", "-DDALVIK_VM"]
 516 
 517 def ccOptFlags = ["-fpic", "-ffunction-sections", "-funwind-tables","-fstack-protector",
 518                   "-Os", "-O2", "-fno-strict-aliasing", "-finline-limit=64", "-fomit-frame-pointer"]
 519 def ccWarnFlags = ["-Wa,--noexecstack", "-Wno-psabi"]
 520 def ccArchFlags = ["-mthumb", "-msoft-float", "-D__ARM_ARCH_5__", "-D__ARM_ARCH_5T__", "-D__ARM_ARCH_5E__",
 521                    "-D__ARM_ARCH_5TE__", "-march=armv5te" , "-mtune=xscale"]
 522 def ccDebugFlags = [IS_DEBUG_NATIVE ? "-DDEBUG" : "-DNDEBUG"]
 523 def ccDefaultIncludeFlags = ["-I$ndk/platforms/$ndk_target/arch-arm/usr/include"]
 524 
 525 def linkFlags = ["--sysroot=$sysroot",
 526                  "-Wl,--no-undefined", "-Wl,-z,noexecstack", "-lc", "-lm", "-shared",
 527                  "-L$ndk/platforms/$ndk_target/arch-arm/usr/lib"]
 528 
 529 DALVIK.activity = [:]
 530 DALVIK.activity.javahSource = files("${project("graphics").buildDir}/classes/dalvik")
 531 DALVIK.activity.javahClasspath = files("${project("graphics").buildDir}/classes/dalvik", "$sdk/platforms/$sdk_target/android.jar")
 532 DALVIK.activity.javahInclude = ["javafxports/android/**"]
 533 DALVIK.activity.nativeSource = file("${project("graphics").projectDir}/src/dalvik/native")
 534 DALVIK.activity.compiler = compiler
 535 DALVIK.activity.linker = linker
 536 DALVIK.activity.lib = "activity"
 537 DALVIK.activity.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 538     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 539 DALVIK.activity.linkFlags = [linkFlags, "-landroid", "-llog"].flatten()
 540 
 541 DALVIK.webview = [:]
 542 DALVIK.webview.javahSource = files("${project("web").buildDir}/classes/android")
 543 DALVIK.webview.javahClasspath = files("${project("web").buildDir}/classes/android")
 544 DALVIK.webview.javahInclude = [
 545     "com/sun/webkit/NativeWebView.class"
 546 ]
 547 DALVIK.webview.nativeSource = [
 548     files("${project("web").projectDir}/src/android/native/native_webview.c",
 549 "${project("web").projectDir}/src/android/native/android_webview.c")
 550 ]
 551 DALVIK.webview.compiler = compiler
 552 DALVIK.webview.linker = linker
 553 DALVIK.webview.lib = "webview"
 554 DALVIK.webview.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 555     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 556 DALVIK.webview.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()
 557 
 558 DALVIK.dvkwebview = [:]
 559 DALVIK.dvkwebview.javahSource = files("${project("web").buildDir}/classes/android")
 560 DALVIK.dvkwebview.javahClasspath = files("${project("web").buildDir}/classes/android")
 561 DALVIK.dvkwebview.javahInclude = [
 562     "com/sun/webkit/NativeWebView.class"
 563 ]
 564 DALVIK.dvkwebview.nativeSource = [
 565     file("${project("web").projectDir}/src/android/native/android_webview.c")
 566 ]
 567 DALVIK.dvkwebview.compiler = compiler
 568 DALVIK.dvkwebview.linker = linker
 569 DALVIK.dvkwebview.lib = "android_webview"
 570 DALVIK.dvkwebview.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 571     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 572 DALVIK.dvkwebview.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()
 573 
 574 DALVIK.glass = [:]
 575 // DALVIK.glass.variants = ["eglfb", "lensport"]
 576 DALVIK.glass.variants = []
 577 DALVIK.glass.variants = ["monocle"]
 578 DALVIK.glass.javahSource = files("${project("graphics").buildDir}/classes/dalvik",
 579  "${project("graphics").buildDir}/classes/main")
 580 DALVIK.glass.javahClasspath = files("${project("graphics").buildDir}/classes/main",
 581  "${project("graphics").buildDir}/classes/dalvik",
 582  "${project("base").buildDir}/classes/main",
 583  "$sdk/platforms/$sdk_target/android.jar")
 584 DALVIK.glass.javahInclude = [
 585     "javafxports/android/**",
 586     "com/sun/glass/ui/monocle/*",
 587     "com/sun/glass/ui/monocle/util/*",
 588     "com/sun/glass/events/**",
 589     "com/sun/glass/ui/*",
 590     "com/sun/glass/ui/android/*",
 591     "com/sun/glass/ui/lens/*"]
 592 
 593 DALVIK.glass.lensport = [:]
 594 DALVIK.glass.lensport.nativeSource = [
 595     file("${project("graphics").projectDir}/src/main/native-glass/lens/lensport/initPlatform.c"),
 596     file("${project("graphics").projectDir}/src/main/native-glass/lens/wrapped/wrapped_functions.c")
 597 ]
 598 DALVIK.glass.lensport.compiler = compiler
 599 DALVIK.glass.lensport.linker = linker
 600 DALVIK.glass.lensport.lib = "lens_porting"
 601 DALVIK.glass.lensport.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 602     ccDebugFlags, ccDefaultIncludeFlags, "-DISEGLFB", "-DLENSPORT",
 603     "-I", file("${project("graphics").projectDir}/src/main/native-glass/lens")].flatten()
 604 DALVIK.glass.lensport.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()
 605 
 606 def monocleCFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 607     ccDebugFlags, ccDefaultIncludeFlags, "-DISEGLFB",
 608     "-I", file("${project("graphics").projectDir}/src/main/native-glass/monocle/"),
 609     "-I", file("${project("graphics").projectDir}/src/dalvik/native/")
 610 ].flatten()
 611 
 612 DALVIK.glass.monocle = [:]
 613 DALVIK.glass.monocle.nativeSource = [
 614         file("${project("graphics").projectDir}/src/main/native-glass/monocle"),
 615         file("${project("graphics").projectDir}/src/main/native-glass/monocle/android"),
 616         file("${project("graphics").projectDir}/src/main/native-glass/monocle/util") ]
 617 DALVIK.glass.monocle.compiler = compiler
 618 DALVIK.glass.monocle.ccFlags = monocleCFlags
 619 DALVIK.glass.monocle.linker = linker
 620 DALVIK.glass.monocle.linkFlags =  [linkFlags, "-ldl", "-llog", "-landroid", "-lGLESv2", "-lEGL"].flatten()
 621 
 622 DALVIK.glass.monocle.lib = "glass_monocle"
 623 
 624 DALVIK.javafxPlatformDefault="eglfb"
 625 
 626 def monoclePlatformAdditions = """
 627 monocle.glass.platform=Monocle
 628 monocle.prism.order=es2,sw
 629 monocle.prism.eglfb=true
 630 monocle.prism.lcdtext=false
 631 monocle.prism.maxvram=128m
 632 monocle.prism.targetvram=112m
 633 monocle.use.egl=true
 634 monocle.use.gles2=true
 635 monocle.embedded=monocle
 636 monocle.com.sun.javafx.isEmbedded=true
 637 monocle.doNativeComposite=true
 638 monocle.com.sun.javafx.scene.control.skin.FXVK.cache=true
 639 monocle.prism.glDepthSize=0
 640 monocle.com.sun.javafx.gestures.zoom=true
 641 monocle.com.sun.javafx.gestures.rotate=true
 642 monocle.com.sun.javafx.gestures.scroll=true"""
 643 
 644 
 645 
 646 DALVIK.glass.eglfb = [:]
 647 DALVIK.glass.eglfb.nativeSource = [
 648     file("${project("graphics").projectDir}/src/main/native-glass/lens"),
 649     file("${project("graphics").projectDir}/src/main/native-glass/lens/wm"),
 650     file("${project("graphics").projectDir}/src/main/native-glass/lens/cursor/nullCursor"),
 651     file("${project("graphics").projectDir}/src/main/native-glass/lens/dalvik")
 652 ]
 653 DALVIK.glass.eglfb.compiler = compiler
 654 DALVIK.glass.eglfb.linker = linker
 655 DALVIK.glass.eglfb.lib = "glass_lens_eglfb"
 656 DALVIK.glass.eglfb.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 657     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 658 DALVIK.glass.eglfb.linkFlags = [linkFlags, "-ldl", "-landroid", "-llog"].flatten()
 659 
 660 DALVIK.prism = [:]
 661 DALVIK.prism.javahInclude = ["com/sun/prism/impl/**/*", "com/sun/prism/PresentableState*"]
 662 DALVIK.prism.nativeSource = file("${project("graphics").projectDir}/src/main/native-prism")
 663 DALVIK.prism.compiler = compiler
 664 DALVIK.prism.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 665     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 666 DALVIK.prism.linker = linker
 667 DALVIK.prism.linkFlags = [linkFlags].flatten()
 668 DALVIK.prism.lib = "prism_common"
 669 
 670 DALVIK.prismSW = [:]
 671 DALVIK.prismSW.javahInclude = ["com/sun/pisces/**/*"]
 672 DALVIK.prismSW.nativeSource = file("${project("graphics").projectDir}/src/main/native-prism-sw")
 673 DALVIK.prismSW.compiler = compiler
 674 DALVIK.prismSW.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 675     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 676 DALVIK.prismSW.linker = linker
 677 DALVIK.prismSW.linkFlags = [linkFlags].flatten()
 678 DALVIK.prismSW.lib = "prism_sw"
 679 
 680 DALVIK.decora = [:]
 681 DALVIK.decora.compiler = compiler
 682 DALVIK.decora.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 683     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 684 DALVIK.decora.linker = linker
 685 DALVIK.decora.linkFlags = [linkFlags].flatten()
 686 DALVIK.decora.lib = "decora_sse"
 687 
 688 DALVIK.iio = [:]
 689 DALVIK.iio.javahInclude = ["com/sun/javafx/iio/**/*"]
 690 DALVIK.iio.nativeSource = [
 691     file("${project("graphics").projectDir}/src/main/native-iio"),
 692     file("${project("graphics").projectDir}/src/main/native-iio/libjpeg7")]
 693 DALVIK.iio.compiler = compiler
 694 DALVIK.iio.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 695     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 696 DALVIK.iio.linker = linker
 697 DALVIK.iio.linkFlags = [linkFlags].flatten()
 698 DALVIK.iio.lib = "javafx_iio"
 699 
 700 DALVIK.prismES2 = [:]
 701 DALVIK.prismES2.variants = ["monocle"]
 702 DALVIK.prismES2.javahInclude = ["com/sun/prism/es2/**/*"]
 703 
 704 DALVIK.prismES2.monocle= [:]
 705 DALVIK.prismES2.monocle.nativeSource = [
 706     file("${project("graphics").projectDir}/src/main/native-prism-es2"),
 707     file("${project("graphics").projectDir}/src/main/native-prism-es2/GL"),
 708     file("${project("graphics").projectDir}/src/main/native-prism-es2/eglWrapper"),
 709     file("${project("graphics").projectDir}/src/main/native-prism-es2/monocle")
 710 ]
 711 DALVIK.prismES2.monocle.compiler = compiler
 712 DALVIK.prismES2.monocle.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 713     ccDebugFlags, ccDefaultIncludeFlags, "-DIS_EGLFB"].flatten()
 714 DALVIK.prismES2.monocle.linker = linker
 715 DALVIK.prismES2.monocle.linkFlags = [linkFlags, "-ldl", "-llog", "-lGLESv2", "-lEGL"].flatten()
 716 DALVIK.prismES2.monocle.lib = "prism_es2_monocle"
 717 
 718 DALVIK.prismES2.eglfb = [:]
 719 DALVIK.prismES2.eglfb.nativeSource = [
 720     file("${project("graphics").projectDir}/src/main/native-prism-es2"),
 721     file("${project("graphics").projectDir}/src/main/native-prism-es2/GL"),
 722     file("${project("graphics").projectDir}/src/main/native-prism-es2/wrapped"),
 723     file("${project("graphics").projectDir}/src/main/native-prism-es2/eglfb")]
 724 DALVIK.prismES2.eglfb.compiler = compiler
 725 DALVIK.prismES2.eglfb.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 726     ccDebugFlags, ccDefaultIncludeFlags, "-DIS_EGLFB"].flatten()
 727 DALVIK.prismES2.eglfb.linker = linker
 728 DALVIK.prismES2.eglfb.linkFlags = [linkFlags, "-ldl", "-llog", "-lGLESv2", "-lEGL"].flatten()
 729 DALVIK.prismES2.eglfb.lib = "prism_es2_eglfb"
 730 
 731 DALVIK.font = [:]
 732 DALVIK.font.javahInclude = [
 733         "com/sun/javafx/font/**/*",
 734         "com/sun/javafx/text/**/*"]
 735 DALVIK.font.nativeSource = [file("$closedDir/javafx-font-native/src")]
 736 DALVIK.font.compiler = compiler
 737 DALVIK.font.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 738     ccDebugFlags, ccDefaultIncludeFlags].flatten()
 739 DALVIK.font.linker = linker
 740 DALVIK.font.linkFlags = [linkFlags].flatten()
 741 DALVIK.font.lib = "javafx_font"
 742 
 743 if (compileNativeText) {
 744     DALVIK.fontNativeFreetype = [:]
 745     DALVIK.fontNativeFreetype.javahInclude = [
 746         "com/sun/javafx/font/freetype/OSFreetype.class"
 747     ]
 748     DALVIK.fontNativeFreetype.nativeSource = [
 749         file("${project("graphics").projectDir}/src/main/native-font/freetype.c")
 750     ]
 751     DALVIK.fontNativeFreetype.compiler = compiler
 752     DALVIK.fontNativeFreetype.linker = linker
 753     DALVIK.fontNativeFreetype.lib = "javafx_font_freetype"
 754 
 755     ccFlags += ["-D_ENABLE_HARFBUZZ"]
 756 
 757     DALVIK.fontNativeFreetype.ccFlags =
 758         [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
 759         ccDebugFlags, ccDefaultIncludeFlags,
 760         "-I$freetypeDir/include", "-I$freetypeDir/include/freetype2"].flatten()
 761 
 762     DALVIK.fontNativeFreetype.linkFlags =
 763         [linkFlags, "-llog",
 764          "-L$freetypeDir/lib", "$freetypeDir/lib/libfreetype.a"].flatten()
 765 }
 766 
 767 DALVIK.media = [:]
 768 DALVIK.media.compiler = compiler
 769 DALVIK.media.linker = linker
 770 DALVIK.media.lib = file("$compilerHome/bin/${toolchainArchs[0]}-ar").getAbsolutePath()
 771 DALVIK.includeEGL = true
 772 DALVIK.includeGTK = true
 773 DALVIK.includeLens = true
 774 ext.IS_COMPILE_PANGO = false