После нескольких недель исследований причина этой ошибки была найдена.
Прежде всего, в файле build.gradle необходимо ссылаться только на плагины, используемые продуктом. Итак, в моем случае, прочитав «ожидание включения датчика m или o»», Хосе сказал, что, возможно, проблема возникла из-за магнитометра (например, «m»). В файле gradle я удалил эту ссылку из: plugins 'accelerometer ', 'устройство', 'ориентация', 'хранение', 'вибрация', 'отображение', 'жизненный цикл', 'строка состояния', 'позиция' Но проблема осталась.
В том же направлении я заметил букву «о». 'о', как "Ориентация"? Возможно. Поскольку я принудительно указал ориентацию смартфона в файле AndroidManifest.xml: возможно, плагин ориентации бесполезен в файле build.gradle?
Я так делаю и теперь игра работает нормально.
В заключение, теперь, даже если датчик ориентации не работает в моем телефоне, это не мешает моему продукту.
Просто вопрос: почему JavaFxPorts напрямую не используют плагин Orientation?
Примечание: в конце я также удалил все неиспользуемые плагины в файле build.gradle, например:
плагины «акселерометр», «устройство», «хранилище», «дисплей»
Примечание: Неверные направления расследования:
Есть две возможные причины этого исключения (см. трассировку)
1-я причина: Симптом этого НЕИСПРАВНОГО исключения может быть похож на другой, упомянутый в Общие сведения об утверждении AudioTrack в Android. В этом случае Mimmo решил это следующим образом: «Сделайте размер буфера AudioTrack таким же, как у minBufferSize. Это может решить вашу проблему».
Но в моем случае с AndroidNativeAudio и NativeAudioService невозможно установить этот размер буфера, потому что на моем уровне нет никакого метода для присвоения размера буфера AudioTrack значению minBufferSize. Другой возможностью было бы установить его на низкий уровень звука, управляемый Gluon (я думаю).
Вопрос 1. Как можно установить размер буфера AudioTrack в контексте javafxports + Gluon + AndroidNativeAudio?
Вопрос 2. На низком уровне, рядом с портами Android, каково назначение этого размера, если он существует?
Вторая причина:
Почему кривая относится к магнитометру ("QMCX983D")?
Я очистил проект Eclipse после изменения файла build.gradle, удалив все ссылки на магнитометр. Итак, .apk изменен (19,4 мес на 18 мес).
Но в трассировке сохраняется ссылка на QMCX983D (магнитометр). Это нормально? У меня есть мобильный телефон Archos Diamond S.
У меня нет исходного кода службы Magnetometer.
Итак, почему трассировка всегда может включать ссылку на этот датчик? Скрытая зависимость, которая может создать, например, поток, получающий данные магнитометра?
Спасибо
Примечание. «ArrayIndexOutOfBoundsException» — это только следствие проблемы. Этот ответ хочет перейти к источнику проблемы.
D/AudioTrackShared( 319): front(0x6d4800), mIsOut(1), mAvailToClient=1024 stepCount=1024 minimum=2048, FUTEX_WAKE
D/AudioTrackShared( 319): front(0x6d4800), mIsOut 1, avail 2048, mFrameCount 4096, filled 2048
V/AudioTrack( 319): obtainBuffer(2048) returned 2048 = 2048 + 0 err 0
D/AudioTrackShared( 319): front(0x6d4800), mIsOut 1, avail 0, mFrameCount 4096, filled 4096
D/AudioTrackShared( 319): front(0x6d4800), mIsOut 1, avail 0, mFrameCount 4096, filled 4096
D/AudioTrackShared( 319): front(0x6d4800), mIsOut 1, obtainBuffer() FUTEX_WAIT
D/Surface (13077): Surface::setBuffersDimensions(this=0xf45e5500,w=676,h=1206)
D/QMCX983D( 387): waitting for enable m or o sensor
D/QMCX983D( 387): QMC_IOCTL_GET_OPEN_STATUS failed
D/QMCX983D( 387): QMC_IOCTL_GET_DELAY failed
D/QMCX983D( 387): QMC_IOCTL_SET_YPR failed!
E/AndroidRuntime(13077): FATAL EXCEPTION: JavaFX Application Thread
E/AndroidRuntime(13077): Process: com.gluonapplication, PID: 13077
E/AndroidRuntime(13077): java.lang.ArrayIndexOutOfBoundsException: length=30; index=-1
E/AndroidRuntime(13077): at java.util.ArrayList.get(ArrayList.java:310)
E/AndroidRuntime(13077): atvafx.scene.Parent.updateCachedBounds(Parent.java:1583)
E/AndroidRuntime(13077): at javafx.scene.Parent.recomputeBounds(Parent.java:1527)
E/AndroidRuntime(13077): at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1380)
E/AndroidRuntime(13077): at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078)
E/AndroidRuntime(13077): at javafx.scene.Node.updateGeomBounds(Node.java:3577)
E/AndroidRuntime(13077): at javafx.scene.Node.getGeomBounds(Node.java:3530)
E/AndroidRuntime(13077): at javafx.scene.Node.updateBounds(Node.java:564)
E/AndroidRuntime(13077): at javafx.scene.Parent.updateBounds(Parent.java:1711)
E/AndroidRuntime(13077): at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2408)
E/AndroidRuntime(13077): at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:348)
E/AndroidRuntime(13077): at com.sun.javafx.tk.Toolkit.access$lambda$3(Toolkit.java)
E/AndroidRuntime(13077): at com.sun.javafx.tk.Toolkit$$Lambda$4.run(Unknown Source)
E/AndroidRuntime(13077): at java.security.AccessController.doPrivileged(AccessController.java:52)
E/AndroidRuntime(13077): at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:347)
E/AndroidRuntime(13077): at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:374)
E/AndroidRuntime(13077): at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:525)
E/AndroidRuntime(13077): at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:503)
E/AndroidRuntime(13077): at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$387(QuantumToolkit.java:321)
E/AndroidRuntime(13077): at com.sun.javafx.tk.quantum.QuantumToolkit.access$lambda$2(QuantumToolkit.java)
E/AndroidRuntime(13077): at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$3.run(Unknown Source)
E/AndroidRuntime(13077): at com.sun.glass.ui.monocle.RunnableProcessor.runLoop(RunnableProcessor.java:92)
E/AndroidRuntime(13077): at com.sun.glass.ui.monocle.RunnableProcessor.run(RunnableProcessor.java:51)
E/AndroidRuntime(13077): at java.lang.Thread.run(Thread.java:818)
V/SettingsProvider( 842): call(global:dropbox:data_app_crash) for 0
Сборка.gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.javafxports:jfxmobile-plugin:1.3.2'
}
}
apply plugin: 'org.javafxports.jfxmobile'
repositories {
jcenter()
maven {
url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
}
}
mainClassName = 'com.gluonapplication.GluonApplication'
dependencies {
compile 'com.gluonhq:charm:4.3.0'
}
jfxmobile {
downConfig {
version '3.2.0'
plugins 'accelerometer', 'device', 'orientation', 'storage', 'vibration', 'display', 'lifecycle', 'statusbar', 'position'
}
android {
applicationPackage = 'com.gluonapplication'
manifest = 'src/android/AndroidManifest.xml'
androidSdk = 'C:/Users/pascal/AppData/Local/Android/sdk'
resDirectory = 'src/android/res'
compileSdkVersion = '25'
buildToolsVersion = '25.0.1'
}
ios {
infoPList = file('src/ios/Default-Info.plist')
forceLinkClasses = [
'com.gluonhq.**.*',
'javax.annotations.**.*',
'javax.inject.**.*',
'javax.json.**.*',
'org.glassfish.json.**.*'
]
}
}
Трассировка без какой-либо явной ссылки на магнитометр:
I/MediaPlayerService( 318): [setDataSource] setDataSource fd=57, offset=3166308, length=90559
I/MediaPlayerService( 318): [setDataSource_drm_preCheck] fd=57,path=/data/app/com.gluonapplication-1/base.apk
D/DrmMtkUtil/DrmUtil( 318): checkDcf ----> fd [57]
V/DrmMtkUtil/DrmUtil( 318): checkDcf: first 3 bytes [50][4b][3]
E/DrmMtkUtil/DrmUtil( 318): checkDcf: not dcf type, dcf version value [80]
E/Cta5File( 318): Cta5File::isCta5NormalFile false, bad magic:PK
E/Cta5File( 318): Cta5File::isCta5MultimediaFile false, bad magic:
D/DrmMtkUtil( 318): isDcf: result [-1], isCta5:result [0]
D/Sonivox ( 318): EAS_HWOpenFile ----> use file descriptor [58]
D/DrmMtkUtil/DrmUtil( 318): checkDcf ----> fd [58]
V/DrmMtkUtil/DrmUtil( 318): checkDcf: first 3 bytes [50][4b][3]
E/DrmMtkUtil/DrmUtil( 318): checkDcf: not dcf type, dcf version value [80]
E/Cta5File( 318): Cta5File::isCta5NormalFile false, bad magic:PK
E/Cta5File( 318): Cta5File::isCta5MultimediaFile false, bad magic:
D/DrmMtkUtil( 318): isDcf: result [-1], isCta5:result [0]
D/Sonivox ( 318): EAS_HWOpenFile ----> checked, not a DRM file.
D/AudioTrackShared( 318): front(0x343e), mIsOut 1, avail 2972, mFrameCount 4458, filled 1486
V/AudioTrack( 318): obtainBuffer(1486) returned 2972 = 1486 + 1486 err 0
D/AudioTrackShared( 318): front(0x343e), mIsOut 1, avail 1486, mFrameCount 4458, filled 2972
V/AudioTrack( 318): obtainBuffer(1486) returned 1486 = 38 + 1448 err 0
D/MediaPlayerFactory( 318): getPlayerType(): using fd, check for DRM protected midi.
D/AudioTrackShared( 318): front(0x343e), mIsOut 1, avail 1448, mFrameCount 4458, filled 3010
D/DrmMtkUtil/DrmUtil( 318): checkDcf ----> fd [57]
V/AudioTrack( 318): obtainBuffer(1448) returned 1448 = 1448 + 0 err 0
V/DrmMtkUtil/DrmUtil( 318): checkDcf: first 3 bytes [50][4b][3]
E/DrmMtkUtil/DrmUtil( 318): checkDcf: not dcf type, dcf version value [80]
D/AudioTrackShared( 318): front(0x343e), mIsOut 1, avail 0, mFrameCount 4458, filled 4458
D/FileSourceProxy( 318): Fd: 58 register!
D/AudioTrackShared( 318): front(0x343e), mIsOut 1, avail 0, mFrameCount 4458, filled 4458
D/AudioTrackShared( 318): front(0x343e), mIsOut 1, obtainBuffer() FUTEX_WAIT
D/MediaPlayerFactory( 318): Before sniff local sdp
D/MediaPlayerFactory( 318): After sniff local sdp
D/FileSourceProxy( 318): Fd: 58 unregister!
D/FileSourceProxy( 318): Fd: 58, File Cache hit rate: 0.00
D/FileSourceProxy( 318): Fd: 58 register!
D/WVMDrmPlugIn( 317): WVMDrmPlugin::onInitialize : 5043
D/WVMDrmPlugIn( 317): WVMDrmPlugin::onSetOnInfoListener : add 5043
D/DrmCtaPlugIn( 317): onInitialize() : uniqueId : 5043
D/DrmCtaPlugIn( 317): encrypt thread has being created
D/DrmCtaPlugIn( 317): decrypt thread has being created
D/DrmCtaPlugIn( 317): onSetOnInfoListener(): uniqueId : 5043
D/DrmCtaPlugIn( 317): onSetOnInfoListener(): native
D/DrmMtkPlugIn( 317): DrmMtkPlugIn::onInitialize : 5043
D/DrmMtkPlugIn( 317): DrmMtkPlugIn::onSetOnInfoListener : 504
D/DrmManagerClient(Native)( 318): DrmManagerClient(): mUniqueId=[5043]
D/DrmManager(Native)( 317): pid = 11680
D/DrmManager(Native)( 317): pid_str = 11680
D/DrmCtaPlugIn( 317): onOpenDecryptSession() [5043], fd = 15, offset = 3166308, length = 9055
E/DrmCtaPlugIn( 317): [ERROR]onOpenDecryptSession - The key is not set by user
D/DrmMtkPlugIn( 317): onOpenDecryptSession() [5043], Start with file descryptor
D/DrmMtkUtil/DrmUtil( 317): parseDcf ----> fd [15
V/DrmMtkUtil/DrmUtil( 317): parseDcf: first 3 bytes [50][4b][3]
E/DrmMtkUtil/DrmUtil( 317): parseDcf: not dcf type, dcf version value [80]
E/DrmMtkPlugIn( 317): onOpenDecryptSession() : failed to parse dcf file.
D/WVMDrmPlugIn( 317): WVMDrmPlugin::onTerminate : 5043
D/DrmCtaPlugIn( 317): onTerminate():uniqueId : 5043
D/DrmMtkPlugIn( 317): DrmMtkPlugIn::onTerminate : 5043
D/QMCX983D( 369): waitting for enable m or o sensor
D/QMCX983D( 369): QMC_IOCTL_GET_OPEN_STATUS failed
D/QMCX983D( 369): QMC_IOCTL_GET_DELAY failed
D/QMCX983D( 369): QMC_IOCTL_SET_YPR failed!
D/DrmManagerClient(Native)( 318): ~DrmManagerClient(): mUniqueId=[5043]
E/AndroidRuntime(11680): FATAL EXCEPTION: JavaFX Application Thread
E/AndroidRuntime(11680): Process: com.gluonapplication, PID: 11680
E/AndroidRuntime(11680): java.lang.ArrayIndexOutOfBoundsException: length=30; index=-
E/AndroidRuntime(11680): at java.util.ArrayList.get(ArrayList.java:310)
E/AndroidRuntime(11680): at javafx.scene.Parent.updateCachedBounds(Parent.java:1583)
E/AndroidRuntime(11680): at javafx.scene.Parent.recomputeBounds(Parent.java:1527)
E/AndroidRuntime(11680): at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1380)
E/AndroidRuntime(11680): at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078)
E/AndroidRuntime(11680): at javafx.scene.Node.updateGeomBounds(Node.java:3577)
E/AndroidRuntime(11680): at javafx.scene.Node.getGeomBounds(Node.java:3530)
QMC_IOCTL_GET_OPEN_STATUS
, он показывает только несколько результатов GitHub и ваши вопросы в SO. Кажется, QMCX983D - это магнитный датчик вашего устройства. Может быть, вы вызываете его с очень высокой скоростью, и это вызывает сбой? Вы тестировали на другом устройстве? Пробовали ли вы более низкие ставки? - person José Pereda   schedule 26.06.2017gradlew clean
, чтобы удалить папку сборки. - person José Pereda   schedule 27.06.2017