JavaFX, Gluon для Android и ожидание сообщения об исключении датчика m или o FATAL?

После нескольких недель исследований причина этой ошибки была найдена.

Прежде всего, в файле 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)

person Pascal DUTOIT    schedule 26.06.2017    source источник
comment
Если вы гуглите QMC_IOCTL_GET_OPEN_STATUS, он показывает только несколько результатов GitHub и ваши вопросы в SO. Кажется, QMCX983D - это магнитный датчик вашего устройства. Может быть, вы вызываете его с очень высокой скоростью, и это вызывает сбой? Вы тестировали на другом устройстве? Пробовали ли вы более низкие ставки?   -  person José Pereda    schedule 26.06.2017
comment
Хосе: Я удалил все ссылки на магнитометр, кроме build.gradle. Теперь я удалил его из этого файла. Когда я снова тестирую, в трассировке всегда упоминается QMC. Что делать? Вы можете увидеть файл build.gradle выше. Существует ли другой системный файл, который может неявно улавливать функции магнитометра? Плагин javafxports может предоставить, в любом случае, функции магнитометра?   -  person Pascal DUTOIT    schedule 27.06.2017
comment
Только компас использует магнитометр. Вы можете убедиться, что классы Magnetometer не добавлены в папку build/tmp/expandesArchives. Чего я не знаю, так это того, может ли внутри датчик акселерометра использовать датчик магнитометра.   -  person José Pereda    schedule 27.06.2017
comment
Теперь я тоже не пользуюсь компасом. И я удалил его из своего проекта, в том числе в файле build.fradle. Но в папке expandArchives много отсылок к Magnetomer: его сервисный класс, charm-down-plugin-magnetometer-3.2.0, .... Могу ли я удалить их из этой папки перед повторной сборкой?   -  person Pascal DUTOIT    schedule 27.06.2017
comment
Просто запустите gradlew clean, чтобы удалить папку сборки.   -  person José Pereda    schedule 27.06.2017
comment
Хосе: Теперь с задачами gradle все в порядке (нет опорного магнитометра и компаса), но после 10 минут теста возникает аналогичное исключение: 369): Ошибка QMC_IOCTL_GET_OPEN_STATUS (см. выше). italic_Я не понимаю, где и почему всегда упоминается QMC, тогда как в моем приложении сейчас только один датчик: акселерометр._italic Я думал, что два датчика (акселерометр и магнитометр) независимы. Это не так?   -  person Pascal DUTOIT    schedule 29.06.2017