java - 无法在 Android x86_64 上安装 JavaFX 应用程序

标签 java android gradle javafx javafxports

我设法使用 gradle 和 javafxport 构建了一个 JavaFX 应用程序,但 apk 无法安装在我的设备上。

这是我的 build.gradle:

task wrapper(type: Wrapper) {
    gradleVersion = '2.4'
}

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.0.0-b10'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

mainClassName = 'java.Main'

repositories {
    jcenter()
}

jfxmobile {
    ios {
        forceLinkClasses = ['java.**.*']
    }
    android {
        applicationPackage = 'com.superflush.java'
    androidSdk = 'C:/Users/USERNAME/AppData/Local/Android/android-sdk'
    }
}

我的设备是运行原生 Android 5.0 的华硕 Zenfone2

它是 x86_64,所以我怀疑这可能是一个问题,但我不确定如何诊断。有什么建议如何解决这个问题吗?

我设法获得了标准 4.4.2 ARM 手机,因此它可以安装,但无法运行(黑屏),这是执行时的 logcat 错误输出:

E/DalvikLauncher(12088): java.lang.ClassNotFoundException: Didn't find class "application.Main" on path: DexPathList[[zip file "/data/app/com.superflu
sh.java-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.superflush.java-2, /vendor/lib, /system/lib]]
E/DalvikLauncher(12088):        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/DalvikLauncher(12088):        at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
E/DalvikLauncher(12088):        at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
E/DalvikLauncher(12088):        at javafxports.android.DalvikLauncher.resolveApplicationClass(DalvikLauncher.java:232)
E/DalvikLauncher(12088):        at javafxports.android.DalvikLauncher.launchApp(DalvikLauncher.java:134)
E/DalvikLauncher(12088):        at javafxports.android.FXDalvikEntity.getLauncherAndLaunchApplication(FXDalvikEntity.java:118)
E/DalvikLauncher(12088):        at javafxports.android.FXDalvikEntity.surfaceCreated(FXDalvikEntity.java:144)
E/DalvikLauncher(12088):        at android.view.SurfaceView.updateWindow(SurfaceView.java:572)
E/DalvikLauncher(12088):        at android.view.SurfaceView.access$000(SurfaceView.java:86)
E/DalvikLauncher(12088):        at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:175)
E/DalvikLauncher(12088):        at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)
E/DalvikLauncher(12088):        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1871)
E/DalvikLauncher(12088):        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
E/DalvikLauncher(12088):        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
E/DalvikLauncher(12088):        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
E/DalvikLauncher(12088):        at android.view.Choreographer.doCallbacks(Choreographer.java:574)
E/DalvikLauncher(12088):        at android.view.Choreographer.doFrame(Choreographer.java:544)
E/DalvikLauncher(12088):        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
E/DalvikLauncher(12088):        at android.os.Handler.handleCallback(Handler.java:733)
E/DalvikLauncher(12088):        at android.os.Handler.dispatchMessage(Handler.java:95)
E/DalvikLauncher(12088):        at android.os.Looper.loop(Looper.java:136)
E/DalvikLauncher(12088):        at android.app.ActivityThread.main(ActivityThread.java:5149)
E/DalvikLauncher(12088):        at java.lang.reflect.Method.invokeNative(Native Method)
E/DalvikLauncher(12088):        at java.lang.reflect.Method.invoke(Method.java:515)
E/DalvikLauncher(12088):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/DalvikLauncher(12088):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
E/DalvikLauncher(12088):        at dalvik.system.NativeStart.main(Native Method)

这是我的项目结构,Main.java 是主要的:

Project structure in Eclipse

最佳答案

首先,在 mainClassName 下,您应该添加主类的名称(例如 JavaFXApp),包括包。像这样的东西:

mainClassName = 'com.superflush.java.JavaFXApp'

android 内,您不需要 applicationPackage 行。

成功构建 apk 后,如果将其安装在设备上,请尝试运行它。保持连接,然后在命令行上运行 adb logcat 以查看所有输出并查找任何可能的异常(如果不起作用)。

编辑

根据OP答案的最新更改,这是一个更正确的答案。

对于初学者来说,Main java 类应该位于正确命名的包内。您必须遵循 Android 包名称约定规则,因此类似这样的内容将起作用:

package com.julioqc.superflush;

另请注意,您将在这些文件夹下找到您的主类:

src/main/java/com/julioqc/superFlush/Main.java

(注意 main/java 不是包名称的一部分)。

因此,您的资源应该位于相同的文件夹结构下:

src/main/resources/com/julioqc/superFlush/application.css
src/main/resources/com/julioqc/superFlush/Image.jpg ...

最后,这应该是 Build.gradle 文件:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.0.0-b10'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

mainClassName = 'com.julioqc.superflush.Main'

repositories {
    jcenter()
}

jfxmobile {
    ios {
        forceLinkClasses = ['com.julioqc.superflush.**.*']
    }
    android {
        androidSdk = 'C:/Users/<user>/AppData/Local/Android/android-sdk'
    }
}

关于java - 无法在 Android x86_64 上安装 JavaFX 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31234915/

相关文章:

java - Gradle + Box2D b2PolygonShape+ Java(TM) SE 二进制文件

java - 是否可以使用 DaisyDiff 保留输入标记?

java - 如何存储返回列表以便我可以在另一个类中使用它?

java - 如何以文本形式运行和下载 BusinessObjects 报告

java - Android 游戏开发(编程/算法)问题

android - Android Google Route Map 中多段线上的箭头标记

java - 具有不同参数的策略模式

android - 如何更改默认 EditText 的样式

gradle - gradle中的版本号

java - Spring RESTful 服务作为 WAR 而不是 Tomcat 中的 JAR