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