java.lang.NoClassDefFoundError: javafxports.android.FXDalvikEntity$2
Получение следующей ошибки при запуске приложения на телефоне Android
FATAL EXCEPTION: main
Process: ie.murphysoftware.games.magnatron, PID: 17378
java.lang.NoClassDefFoundError: javafxports.android.FXDalvikEntity$2
at javafxports.android.FXDalvikEntity.jfxEventsLoop(FXDalvikEntity.java:484)
at javafxports.android.FXDalvikEntity.<init>(FXDalvikEntity.java:118)
at javafxports.android.FXActivity.onCreate(FXActivity.java:140)
at android.app.Activity.performCreate(Activity.java:5426)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Эта ошибка отображается при запуске приложения на Android версии KitKat API Level 19 и, возможно, более низких версиях Android.
В APK есть 2 класса dex
- classes.dex
- classes2.dex
Кажется, проблема в том, что первичный файл dex classes.dex содержит класс FXDalvikEntity, а classes2.dex содержит его подклассы, которые
- FXDalvikEntity $ 1
- FXDalvikEntity $ 2
- FXDalvikEntity $ InternalSurfaceView
- FXDalvikEntity $ InternalTextureView
- FXDalvikEntity $ SurfaceDetails
Когда приложение запускается, классы, содержащиеся в classes.dex, загружаются, а классы из classes2.dex - нет, и это вызывает ошибку.
Есть ли способ заставить dex создать только один файл dex?
Моя среда сборки
Eclipse - Neon
Gradle 3.1
compileSdkVersion = 25
minSdkVersion = 17
buildToolsVersion = "25.0.0"
applicationPackage = 'org.javafxports.ensemble'
2 ответа
Пока нет решения, но причина проблемы.
- Размер приложения требует 2 файла dex.
- Android SDK версии 20 или ниже не поддерживает мультидексные файлы естественным образом и требует дополнительной библиотеки Android "multidex.jar". Для реализации библиотеки multidex требуется дополнительный код, который подробно описан по этой ссылке. Использование multidex, когда minSdkVersion установлен на 20 или ниже
- Эти подробные инструкции не учитывают иерархию javafxports и требуют, чтобы класс был необходим для реализации функциональности multidex.
extends android.support.multidex.MultiDexApplication
или переопределяетApplication.attachBaseContext(...)
,
Таким образом, решение теперь, кажется, состоит в том, чтобы найти способ javafx.application.Application
позвонить Multidex.install(this);
ведущий к новому вопросу о stackru javafxports multidex minSdkVersion установлен на 20 или меньше
Вот что указывает исключение, полученное вами:
Брошенный, если виртуальная машина Java или экземпляр ClassLoader пытается загрузить определение класса (как часть обычного вызова метода или как часть создания нового экземпляра с использованием нового выражения), и определение класса не может быть найдено.
(источник: https://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError.html)
Это означает, что класс, к которому осуществляется доступ (прямо или косвенно) в вашем приложении, не существует в среде выполнения. Поэтому, вероятно, вам нужно выбрать более новую версию в качестве среды выполнения. Альтернативная причина может заключаться в том, что используемых вами зависимостей нет (я не уверен, как приложения Android справляются со сторонними зависимостями), и вам нужно включить их в свое приложение.