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

Cannot install JavaFX app on Android x86_64

我设法使用 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'
    }
}

我的设备是华硕 Zenfone2 运行ning stock Android 5.0

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

我设法得到了标准 4.4.2 ARM phone 所以它安装了但它不会 运行 (黑屏)这是执行时的 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[=13=]0(SurfaceView.java:86)
E/DalvikLauncher(12088):        at android.view.SurfaceView.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 是主要的:

首先,在 mainClassName 下你应该添加你的名字 class (比方说 JavaFXApp),包括包。像这样:

mainClassName = 'com.superflush.java.JavaFXApp'

android 内,您不需要 applicationPackage 行。

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

编辑

根据对 OP 答案的最后更改,这是一个更合适的答案。

对于初学者来说,Main java class 应该在一个正确命名的包中。您必须遵循 Android 包名称约定规则,所以像这样的东西会起作用:

package com.julioqc.superflush;

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

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'
    }
}

It is a x86_64 so I suspect that might be an issue but im not sure how to diagnose.

要诊断应用未安装的原因,请通过命令提示符使用 adb 执行安装

adb install myapp.apk

您将获得指示设备上的安装是否失败以及失败原因的输出。

如果您的应用在 ARM 设备而非 x86 设备上正确安装,则您的 adb 可能未提供所有必需的本机库。如果是这种情况,那么 adb install 命令将 return 错误 INSTALL_FAILED_NO_MATCHING_ABIS