Не удается установить приложение JavaFX на Android x86_64
Мне удалось создать приложение JavaFX, используя gradle и javafxport, но 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'
}
}
Моим устройством является Asus Zenfone2 под управлением стоковой Android 5.0
Это x86_64, поэтому я подозреваю, что это может быть проблемой, но я не знаю, как диагностировать. Любое предложение, как решить эту проблему?
Мне удалось заполучить стандартный телефон ARM 4.4.2, чтобы он установился, но он не запускается (черный экран), и вот вывод 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 является основным:
2 ответа
Прежде всего, под 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'
}
}
Это x86_64, поэтому я подозреваю, что это может быть проблемой, но я не знаю, как диагностировать.
Чтобы выяснить, почему приложение не устанавливается, выполните установку с помощью adb из командной строки.
adb install myapp.apk
Вы получите выходные данные, указывающие, если установка на устройстве не удалась с причиной сбоя.
Если ваше приложение корректно устанавливается на устройствах ARM, но не на устройствах x86, вероятно, ваш adb не поставляет все необходимые нативные библиотеки. Если это так, то команда adb install вернет ошибку INSTALL_FAILED_NO_MATCHING_ABIS