1

我很难确切地知道是什么导致了 adb 上的这个错误,因为我正在使用KotlinTornadoFX一个 JavaFX Kotlin 库)和GluonJFXMobile。当我使用 GluonandroidInstall构建我的项目时,我遇到了这个错误,以及一个黑屏:

java.lang.ClassNotFoundException: Didn't find class "com.my.app.example.Main" on path: DexPathList

我正在尝试在此应用程序中使用 JavaFX 3D,但我认为它不会导致错误。

我检查了我的Android Manifest,包名和我的项目一样。

我的项目层次结构是这样的:

root
  libs
  src
    android
    ios
    main
      kotlin
        com.my.app.example
          Main.kt

哪个可能导致 Android 无法找到该文件?因为没有 Java 文件夹。

我的 gradle 文件中包含以下所有内容,已成功编译:

apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'javafx-gradle-plugin'
apply plugin: 'org.javafxports.jfxmobile'
apply plugin: 'org.jetbrains.kotlin.android.extensions'

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
  compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
  compile 'no.tornado:tornadofx:1.7.12'
  compile 'no.tornado:tornadofx-android-compat:1.0.1'
  compile 'com.gluonhq:charm:4.3.7'
  compile fileTree(dir: 'libs', include: '*.jar')
}

fileTree(dir: 'libs', include: '*.jar')是我用来为 JavaFX 导入 ObjModels 的外部库,位于libs我的项目文件夹中。

我怀疑导致此错误的事情:

  1. 我的 Gradle 文件中没有正确的东西,因为我对 Gradle 很糟糕。
  2. 我文件夹中的 .jarlibs未正确包含在 Android apk 中,并以某种方式搞砸了
  3. Kotlin 文件层次结构以某种方式使 Android 无法找到 Main 类,或者它是 Main.kt 而不是 Main.java 的事实

请注意,这个项目在我的桌面上运行良好,所以我的源代码没有问题,只是 Android 特定端的问题。

任何想法是什么原因造成的?谢谢你的帮助!

4

1 回答 1

0

这是一个使用 Kotlin 的 Gluon Mobile 项目的非常简单的示例,可以部署到 Android/iOS。

使用 IntelliJ 的 Gluon 插件,创建一个项目(Single View),并修改 build.gradle 文件:

构建.gradle

buildscript {
    ext.kotlin_version = '1.1.51'
    repositories {
        mavenCentral()
        jcenter()
    }

    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.3.9'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'org.javafxports.jfxmobile'
apply plugin: 'org.jetbrains.kotlin.android.extensions'

repositories {
    jcenter()
    mavenCentral()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.gluon.kotlin.Main'

dependencies {
    compile 'com.gluonhq:charm:4.4.1'
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    compile 'no.tornado:tornadofx:1.7.12'
    compile 'no.tornado:tornadofx-android-compat:1.0.1'

}
jfxmobile {
    downConfig {
        version = '3.6.0'
        plugins 'display', 'lifecycle', 'statusbar', 'storage'
    }
    android {
        manifest = 'src/android/AndroidManifest.xml'
    }
    ios {
        infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = [
                'com.gluonhq.**.*',
                'javax.annotations.**.*',
                'javax.inject.**.*',
                'javax.json.**.*',
                'org.glassfish.json.**.*'
        ]
    }
}

删除/src/main/java包装,然后添加/src/main/kotlin一个。

Main.kt课程在/src/main/kotlin/com/gluon/kotlin/Main.kt

主.kt

package com.gluon.kotlin

import com.gluonhq.charm.glisten.application.MobileApplication
import com.gluonhq.charm.glisten.mvc.View
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon
import javafx.geometry.Pos
import javafx.scene.control.Button
import javafx.scene.control.Label
import javafx.scene.layout.VBox
import tornadofx.plusAssign

class Main: MobileApplication() {

    override fun init() {
        addViewFactory(MobileApplication.HOME_VIEW, {
            val view = View("home")

            val vBox = VBox()
            with (vBox) {
                alignment = Pos.CENTER
                spacing = 30.0
                this += Button("Kotlin", MaterialDesignIcon.CODE.graphic()).apply {
                    println("Click")
                }
                this += Label("Gluon Mobile - Kotlin")
            }
            with(view) {
                this.center = vBox
                this.setOnShown {
                    with(MobileApplication.getInstance().appBar) {
                        this.navIcon = MaterialDesignIcon.MENU.button().apply {
                            println("Click")
                        }
                        this.titleText = "Gluon Mobile - Kotlin"
                    }
                }
            }
            view
        })
    }

}

您可以在桌面上运行该项目,无需androidInstall修改 AndroidManifest 文件,即可使用该任务部署到 Android 设备。

于 2017-11-06T16:02:56.203 回答