Код приложения JavaFXPorts отсутствует в apk

Я пробую свое первое приложение JavaFX на Android, используя JavaFXPorts от Gluon. К сожалению, я не могу собрать apk, содержащий код приложения. Это относится как к моим собственным проектам, так и к примерам, таким как 2048FX Хосе Переды http://jperedadnr.blogspot.com/2015/03/javafx-on-mobile-dream-come-true.html.

Когда я проверяю apks, которые я генерирую, я не могу найти классы, которые я создал в проекте. Я нахожу все необходимые классы SDK и файлы ресурсов приложения. Однако файлы *.class для конкретных приложений отсутствуют.

Я создаю apks, используя задачу gradle «android».

Ниже приведен пример двух моих файлов Gradle. Отображает зависимость от TickerUI.

Дисплеи — build.gradle

group 'com.androidtest'
version '1.0'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.2.4'
    }
}

apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile 'org.testng:testng:6.9.9'
}

retrolambda {
    jdk 'C:\\Program Files\\Java\\jdk1.7.0_75\\bin'
    oldJdk 'C:\\Program Files\\Java\\jdk1.8.0_65\\bin'
    defaultMethods true
    incremental false
}

TickerUI — build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.0.6'
    }
}

apply plugin: 'org.javafxports.jfxmobile'
apply plugin: 'idea'

repositories {
    jcenter()
}

mainClassName = 'com.androidtest.ticker.tickerui.Main'

dependencies {
    compile files('../../Displays/Displays/build/libs/Displays-1.0.jar')
}

jfxmobile {
    android {
        androidSdk = 'C:\\Program Files (x86)\\Android\\android-sdk'
        compileSdkVersion = 23
        manifest = 'src/android/AndroidManifest.xml'
    }
}

Примечание Я занимаюсь миграцией своего личного Nexus дома, поэтому я использую локальную файловую зависимость.

Версии Java Вот мои версии Java. Intellij: 1.8.0_65 x64 Gradle: 1.8.0_65 x64 SDK: 1.8.0_65 x64. Android SDK: 24.4.1 (x86?) Я попытался переключиться на x86-версии Java, но получил ошибку dex. «Не удалось инициализировать виртуальную машину, недостаточно места для кучи объектов».

Если у кого-то есть какие-либо предложения, я был бы очень признателен. Заранее спасибо,

Джек

Редактировать 1 Я не обнаружил никаких ошибок в команде Android ./gradlew.bat --info. Однако, когда я установил приложение TickerUI на свой телефон и подключил отладчик, я получил следующую ошибку:

12-18 08:33:33.237  18295-18295/com.androidtest.tickerui E/DalvikLauncher﹕ Launch failed with exception.
java.lang.ClassNotFoundException: Didn't find class "com.androidtest.tickerui.Main" on path: DexPathList[[zip file "/data/app/com.androidtest.tickerui-2/base.apk"],nativeLibraryDirectories=[/data/app/com.androidtest.tickerui-2/lib/arm, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at javafxports.android.DalvikLauncher.resolveApplicationClass(DalvikLauncher.java:264)
        at javafxports.android.DalvikLauncher.launchApp(DalvikLauncher.java:164)
        at javafxports.android.FXDalvikEntity.getLauncherAndLaunchApplication(FXDalvikEntity.java:119)
        at javafxports.android.FXDalvikEntity.surfaceCreated(FXDalvikEntity.java:145)
        at android.view.SurfaceView.updateWindow(SurfaceView.java:607)
        at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:184)
        at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:921)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2164)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
        at android.view.Choreographer.doCallbacks(Choreographer.java:590)
        at android.view.Choreographer.doFrame(Choreographer.java:560)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5951)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Suppressed: java.lang.ClassNotFoundException: com.androidtest.tickerui.Main
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 23 more
 Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

Я проверил свой TickerUI.apk и обнаружил внутри пакета два файла .dex. Я не уверен, почему Android не находит мой основной класс.

Изменить 2

Я начинаю подозревать, что проблема в моем манифесте Android. Это ниже:

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidtest.tickerui" android:versionCode="1" android:versionName="1.0">
        <supports-screens android:xlargeScreens="true"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="23"/>
        <application android:label="TickerUI" android:name="android.support.multidex.MultiDexApplication" android:icon="@mipmap/ic_launcher">
                <activity android:name="javafxports.android.FXActivity" android:label="TickerUI" android:configChanges="orientation|screenSize">
                        <meta-data android:name="main.class" android:value="com.androidtest.tickerui.Main"/>
                        <meta-data android:name="debug.port" android:value="0"/>
                        <intent-filter>
                                <action android:name="android.intent.action.MAIN"/>
                                <category android:name="android.intent.category.LAUNCHER"/>
                        </intent-filter>
                </activity>
        </application>
</manifest>

person jecjackal    schedule 17.12.2015    source источник
comment
Обычно все файлы классов объединены в файлы dex. Можете ли вы развернуть свое приложение на своем мобильном телефоне? У вас есть ошибка? Попробуйте запустить./gradlew --info android и опубликуйте трассировку стека, если обнаружите какое-либо исключение.   -  person José Pereda    schedule 18.12.2015
comment
Спасибо, что так быстро ответили, Хосе. Я попробовал то, что вы предложили в проекте 2048FX. Этот проект работает, как и ожидалось, и отлично работает на моем телефоне. Я не знал, что классы находятся в файлах .dex внутри APK. Это подтверждает, что мои локальные наборы инструментов работают. В ближайшее время попробую свой проект.   -  person jecjackal    schedule 18.12.2015
comment
См. Редактировать 1. Я не нашел следов стека в своем выполнении ./gradlew --info для Android. Файлы .dex находятся в моем apk, но по какой-то причине Android не может найти мой файл Main. Сейчас я прочитаю свой консольный вывод. Еще раз спасибо Хосе.   -  person jecjackal    schedule 18.12.2015
comment
В вашем сценарии вы устанавливаете свой основной класс 'com.androidtest.ticker.tickerui.Main', а исключение жалуется на другой класс: 'com.androidtest.tickerui.Main'. Вы его изменили? Также проверьте файл AndroidManifest.xml.   -  person José Pereda    schedule 18.12.2015
comment
Я сделал рефакторинг несколько дней назад. Дай мне проверить.   -  person jecjackal    schedule 18.12.2015
comment
Вот оно. Мой манифест указывал на неправильный класс. Большое спасибо Хосе!   -  person jecjackal    schedule 18.12.2015
comment
Предоставьте свое решение в качестве ответа на ваш вопрос   -  person Kirby    schedule 18.12.2015


Ответы (1)


У меня был неправильный основной класс, указанный в моем манифесте Android. Спасибо за помощь Хосе.

person jecjackal    schedule 19.12.2015