【问题标题】:Cannot install JavaFX app on Android x86_64无法在 Android x86_64 上安装 JavaFX 应用程序
【发布时间】:2015-09-22 22:54:34
【问题描述】:

我设法使用 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 运行库存 Android 5.0

这是一个 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 是主要的:

【问题讨论】:

    标签: java android gradle javafx javafxports


    【解决方案1】:

    首先,在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'
        }
    }
    

    【讨论】:

    • 是的!它在等待回复时尝试了 logcat 等待,但确实发现了您所说的问题! java.lang.ClassNotFoundException:没有找到类“application.Main”我如何才能弄清楚“mainClassName”到底是什么?那是我似乎不明白的:(
    • 你换了mainClassName吗?
    • 我尝试了很多东西......我不知道它应该是什么样的,这就是问题所在。 java 项目主类位于“\src\application\Main.java”。这意味着什么?
    • 对于初学者,请尝试发布您的项目结构(包和类),包括主类。
    • 看来application.Main 应该是你的mainClassName。检查 Main.java 上的包名。
    【解决方案2】:

    这是一个 x86_64,所以我怀疑这可能是一个问题,但我不确定如何 诊断。

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

    adb install myapp.apk
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多