Не удается установить приложение 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

Другие вопросы по тегам