使用 gradlew 将 JavaFX 转换为 Android

Posted

技术标签:

【中文标题】使用 gradlew 将 JavaFX 转换为 Android【英文标题】:Converting JavaFX to Android using gradlew 【发布时间】:2015-10-28 06:10:36 【问题描述】:

我是 JavaFX 新手,我正在尝试使用 javafxmobile 插件转换为 android apk。 在使用 gradlew 转换为 Android 时,我收到类似 Execution failed for task ':dex' 的错误。 我的系统安装了 JDK 1.8u40 并配置了 gradle。 我也尝试使用 Dalvik SDK,但它仍然没有转换。

这是完整的错误:

C:\Users\Vss\Documents\NetBeansProjects\andyTest>gradlew android
:compileJava UP-TO-DATE
:compileRetrolambdaMain UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileAndroidJava UP-TO-DATE
:compileRetrolambdaAndroid SKIPPED
:compileTestJava UP-TO-DATE
:compileRetrolambdaTest SKIPPED
:compileRetrolambda UP-TO-DATE
:mergeClassesIntoJar
:validateManifest
:collectMultiDexComponents
:shrinkMultiDexComponents
:createMainDexList
:dex
[ant:java] Java Result: 1
:dex FAILED

FAILURE: Build failed with an exception.

出了什么问题:

任务 ':dex' 执行失败。

org.gradle.api.GradleException(没有错误信息)

试过了:

使用 --stacktrace 选项运行以获取堆栈跟踪。 使用 --info 或 --debug 选项运行以获得更多注销 放。

构建失败

总时间:1 分 9.768 秒

当我使用 --stacktrace 运行时,我收到以下错误详细信息:

C:\Users\Vss\Documents\NetBeansProjects\andyTest>gradlew -stacktrace android
:compileJava UP-TO-DATE
:compileRetrolambdaMain UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileAndroidJava UP-TO-DATE
:compileRetrolambdaAndroid SKIPPED
:compileTestJava UP-TO-DATE
:compileRetrolambdaTest SKIPPED
:compileRetrolambda UP-TO-DATE
:mergeClassesIntoJar
:validateManifest
:collectMultiDexComponents
:shrinkMultiDexComponents
:createMainDexList
:dex
[ant:java] Java Result: 1
:dex FAILED

FAILURE: Build failed with an exception.

出了什么问题:

任务 ':dex' 执行失败。

org.gradle.api.GradleException(没有错误信息)

试过了: 使用 --info 或 --debug 选项运行以获得更多日志输出。

我的例外是:

org.gradle.api.tasks.TaskExecutionException:任务“:dex”执行失败。 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteAction sTaskExecuter.java:69) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskEx ecuter.java:46) 在 org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecution 分析任务执行器.java:35) 在 org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecut er.java:64) 在 org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.j 艾娃:58) 在 org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourc eFilesTaskExecuter.java:42) 在 org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoAct ionsExecuter.java:52) 在 org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.j 艾娃:53) 在 org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnce 任务执行器.java:43) 在 org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:306) 在 org.gradle.execution.taskgraph.Abs​​tractTaskPlanExecutor$TaskExecutorWorker.executeTask(抽象 TaskPlanExecutor.java:79) 在 org.gradle.execution.taskgraph.Abs​​tractTaskPlanExecutor$TaskExecutorWorker.processTask(抽象 TaskPlanExecutor.java:63) 在 org.gradle.execution.taskgraph.Abs​​tractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlan Executor.java:51) 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)

    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:8

8) 在 org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29) 在 org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 在 org.gradle.execution.DefaultBuildExecuter.access $200(DefaultBuildExecuter.java:23) 在 org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68) 在 org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) 在 org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 在 org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) 在 org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149) 在 org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106) 在 org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86) 在 org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuild ActionExecuter.java:80) 在 org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33) 在 org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24) 在 org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java :36) 在 org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java :26) 在 org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51) 在 org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:169) 在 org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionF 演员.java:237) 在 org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionF 演员.java:210) 在 org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35 ) 在 org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24 ) 在 org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.j 艾娃:206) 在 org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.j 艾娃:169) 在 org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33) 在 org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22) 在 org.gradle.launcher.Main.doAction(Main.java:33) 在 org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45) 在 org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54) 在 org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35) 在 org.gradle.launcher.GradleMain.main(GradleMain.java:23) 在 org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:30) 在 org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:127) 在 org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61) 引起:org.gradle.api.GradleException: 在 org.javafxports.jfxmobile.plugin.android.task.Dex.dex(Dex.groovy:57) 在 org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63) 在 org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction。 doExecute(AnnotationProcessingTaskFactory.java:218) 在 org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction。 执行(AnnotationProcessingTaskFactory.java:211) 在 org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction。 执行(AnnotationProcessingTaskFactory.java:200) 在 org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585) 在 org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActions 任务执行器.java:80) 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteAction sTaskExecuter.java:61) ... 47 更多

构建失败

总时间:1 分 33.13 秒

我的build.gradle文件如下:

    task wrapper(type: Wrapper) 
    gradleVersion = '2.3'
    
    buildscript 
    repositories 
        jcenter()
    

    dependencies 

        classpath 'org.javafxports:jfxmobile-plugin:1.0.0-b9'
        classpath 'org.codehaus.groovy:groovy-backports-compat23:2.3.5'


    
    

    apply plugin: 'org.javafxports.jfxmobile'


    mainClassName = 'andytest.andyTest'

    version = '8u40'

   repositories 
    jcenter()
   


   jfxmobile 

    android 

    applicationPackage = 'andytest.andyhere'




    
    

【问题讨论】:

您的包裹信息与您提供的主类名称不匹配。第一个不是必须的,但主类名应该是完整的包和类名。 groovy 依赖的任何原因?编译或运行时依赖项添加到根级存储库块中。 先生,我没有告诉你哪一个是不需要的。你能详细说明一下吗?我的包名是“andytest”,主类是“AndyTest.java”。 【参考方案1】:

我遇到了同样的问题,您的 android studio 中缺少此目录:

..\Android\sdk\extras\android\support\multidex

这是我自己制作的一个例子: https://github.com/viktorcitaku/JavaFXAndroid

【讨论】:

【参考方案2】:

如果您做过类似的事情,请向我提供您如何做到这一点的详细信息。您使用哪个 IDE 创建 JAVA FX 项目以及如何转换为 Android App。

我正在使用 Netbeans 创建项目。并尝试将其转换为 Android 项目

【讨论】:

【参考方案3】:

我遇到了同样的问题,现在已经解决了。现在我可以编译并制作我的 android apk 了。

所以这些是我遵循的步骤

    确保您已更新您的 sdk 管理器 -> 支持库 到最新版本(23.1.1),当我发布这个时,这对我来说是最新的 回答。这将更新

H:\sdk\extras\android\support\multidex 文件

    设置环境变量名_JAVA_OPTIONS,值为-Xmx1024M 确保在 build.gradle 中添加您的 android sdk 位置 androidSdk='H:/ADT BUNDLE/sdk'

喜欢这个

buildscript 
    repositories 
        jcenter()
    
    dependencies 

           classpath 'org.javafxports:jfxmobile-plugin:1.0.0-b9'


    


apply plugin: 'org.javafxports.jfxmobile'


repositories 
    jcenter()


mainClassName = 'com.fff.Fff'

jfxmobile 
    android 
        manifest = 'src/android/AndroidManifest.xml'
        androidSdk='H:/ADT BUNDLE/sdk'

    

【讨论】:

以上是关于使用 gradlew 将 JavaFX 转换为 Android的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX,将 ArrayList 转换为 ObservableList

如何在 javafx 中将任何文本或字母转换为图像

使用 JavaFX 显示 OpenCV Mat

如何将 SVG 中的 feGaussianBlur 转换为 JavaFX 中的 GaussianBlur 效果?

从 Swing 转换为 JavaFX?

如何将 JavaFX ComboBox 中的选择转换为字符串