I would like to build a JavaFX Android app with JavaFXPorts and Kotlin code. Is it possible to use Kotlin in a JavaFXPorts project? Here's my example Gradle (version 5.6.4) project:
Note: Problem with this code is the Kotlin Runtime... Is there any way to bundle everything in the executable Jar and Apk?
.
├── app
│ ├── src
│ │ ├── android
│ │ │ └── AndroidManifest.xml
│ │ └── main
│ │ └── kotlin
│ │ └── com.example
│ │ └── App.kt
│ └── build.gradle.kts
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── build.gradle.kts
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
./settings.gradle.kts
pluginManagement {
repositories {
gradlePluginPortal()
jcenter()
}
resolutionStrategy {
eachPlugin {
if (requested.id.id == "org.javafxports.jfxmobile") {
useModule("org.javafxports:jfxmobile-plugin:${requested.version}")
}
}
}
}
rootProject.name = "app"
include(":app")
./build.gradle.kts
plugins {
kotlin("jvm") version "1.3.61" apply false
id("org.javafxports.jfxmobile") version "1.3.18" apply false
}
allprojects {
repositories {
jcenter()
}
}
./app/build.gradle.kts
plugins {
kotlin("jvm")
id("org.javafxports.jfxmobile")
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
}
application {
mainClassName = "com.example.App"
}
jfxmobile {
android {
manifest = "src/android/AndroidManifest.xml"
applicationPackage = application.mainClassName
buildToolsVersion = "29.0.2"
compileSdkVersion = "28"
targetSdkVersion = "28"
minSdkVersion = "19"
}
}
./app/src/android/AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="1" android:versionName="1.0">
<supports-screens android:xlargeScreens="true"/>
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" android:maxSdkVersion="28"/>
<application android:label="App" android:name="android.support.multidex.MultiDexApplication">
<activity android:label="App" android:name="javafxports.android.FXActivity" android:configChanges="orientation|screenSize">
<meta-data android:name="main.class" android:value="com.example.App"/>
<meta-data android:name="debug.port" android:value="0"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
./app/src/main/kotlin/com/example/App.kt
@file:JvmName("App")
package com.example
import javafx.application.Application
import javafx.geometry.Rectangle2D
import javafx.scene.Scene
import javafx.scene.control.Label
import javafx.scene.layout.StackPane
import javafx.stage.Screen
import javafx.stage.Stage
class App : Application() {
override fun start(primaryStage: Stage?) {
val content = Label("Hello")
val root = StackPane(content)
val bounds: Rectangle2D = Screen.getPrimary().visualBounds
val scene = Scene(root, bounds.width, bounds.height)
primaryStage?.scene = scene
primaryStage?.show()
}
}
You can, but you will probably experience some pain along the way, my suggestion is to go with TornadoFx which is Kotlin UI framework built on top of JavaFx. And it is really nice
Here is the integration guide