我设法使用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是主要的:
答案 0 :(得分: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'
}
}
答案 1 :(得分:1)
这是一个x86_64所以我怀疑这可能是一个问题,但我不知道如何 诊断。
要诊断应用未安装的原因,请使用adb通过命令提示符
执行安装adb install myapp.apk
您将获得输出,指示设备上的安装是否因故障原因而失败。
如果您的应用在ARM设备上正确安装但在x86设备上没有正确安装,则很可能您的adb未提供所有必需的本机库。如果是这种情况,那么adb install命令将返回错误INSTALL_FAILED_NO_MATCHING_ABIS