【问题标题】:java.lang.ClassNotFoundException: Didn't find class "com.my.app.example.Main" on path: DexPathListjava.lang.ClassNotFoundException:在路径上找不到类“com.my.app.example.Main”:DexPathList
【发布时间】:2018-04-13 09:12:54
【问题描述】:

我很难确切 是什么在 adb 上导致此错误,因为我使用的是 KotlinTornadoFX JavaFX Kotlin 库)和带有 JFXMobileGluon。当我使用 Gluon 的 androidInstall 构建我的项目时,我遇到了这个错误,以及一个黑屏:

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. 我的 libs 文件夹中的 .jar 未正确包含在 Android apk 中,并以某种方式搞砸了
  3. Kotlin 文件层次结构以某种方式使 Android 无法找到 Main 类,或者它是 Main.kt 而不是 Main.java 的事实

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

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

【问题讨论】:

  • 能否为 Android 部分添加 Gradle 配置?

标签: android javafx kotlin gluon-mobile tornadofx


【解决方案1】:

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

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

build.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

Main.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
        })
    }

}

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

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 2017-03-16
    • 2017-12-23
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多