Lesen von Android USB Zubehör wirft ENODEV IOException

Also habe ich die Android USB Accessory API implementiert, so dass ich mein Handy an meinen Laptop mit Linux anschließen kann und es das Telefon in den USB-Zubehör-Modus bringt. Dann kann ich auf das Zubehör zugreifen, es öffnen und anfangen, ein Schreiben zu schreiben. Mein Code sieht fast identisch mit dem Beispiel in der Dokumentation aus . Der Hauptunterschied besteht darin, dass ich separate Lese- und Schreibmethoden verwende und über JNI von nativem Code auf sie zugreife.

Hier wird es interessant. Nach erfolgreichem Lesen / Schreiben für ein oder zwei Sekunden schreibt der Massenübertragungsschreiben von meinem Laptop, um Zeitüberschreitungsfehler zu geben, und dann liest der Leseaufruf zum USB-Zubehör in Android eine IOException mit dem ENODEV-Fehlercode. Dies ist mit dem Kabel noch verbunden und UsbManager listet immer noch das Zubehör in der Liste, und ich habe immer noch die Berechtigung dafür.

  • Google Jetzt Steigung / Schatten auf Statusleiste und Navigationsleiste
  • Android Content Provider oder Datenbank?
  • FindViewById () liefert null - versuchte ALLES
  • Beste Weg, um Termine in Android zu vergleichen
  • Warum macht removeOnGlobalLayoutListener einen NoSuchMethodError?
  • Verwenden des Android-Telefons als USB-Host, um externe Laufwerke anzurufen und auf den Speicher des externen Laufwerks zuzugreifen
  • Um die seltsame davon hinzuzufügen, entdeckte ich, dass, wenn ich einen 100ms Schlaf in die Leseschleife stelle, das Problem grundsätzlich weggeht (obwohl es immer noch passiert). Mit dem Schlaf dort ist nicht nur ein schrecklicher Kludge, aber es führt eine unerträgliche Latenz in meine App ein. Je niedriger die Schlafzeit, desto weniger effektiv ist der Hack, wo ist es ineffektiv bei 10ms Schlafzeit.

    Ich übertrage etwa 20-30kbps Echtzeit-Daten mit Massenübertragungen (aber nicht so in Echtzeit, dass eine Massenübertragung nicht ausreicht), und die Übertragungsgröße reicht von 50 bis 800 Bytes bei etwa 20-30Hz. Könnte es eine Beschränkung von USB sein? Ich habe keine Tonne Erfahrung damit, also bin ich im Grunde behandeln es über die gleiche wie eine Netzwerk-Steckdose. Sollte ich kleinere Meldungen anlegen und sie in weniger häufigen, aber größeren Transfers abschicken? Gibt es ein Problem mit kleinen, hochpräzisen Frequenzmassenübertragungen? Ich werde mir das anschauen, aber ich bin grundsätzlich dabei, Strohhalme zu fassen.

    Hardware:

    • Laptop läuft Ubuntu 10.04 und benutzt mit libusb 1.0.0.
    • Telefon ist Galaxy Nexus S laufende Lager Android 4.1.2.

  • JRE auf Android
  • Ist es möglich, zwischen dem aktuellen standort und einer straße, avenue oder bereich zu gelangen
  • Bluetooth-Verbindung zwischen Android und Lego Mindstorm NXT
  • Wie kann ich ein CordovaWebView von PhoneGap über eine native Ansicht in Android überlagern?
  • Wie repariere ich InkompatibleClassChangeError während Android Jackson Parsing mit Annotationen in Android Lollipop?
  • Android RadioButton Ausgabe in android 4
  • One Solution collect form web for “Lesen von Android USB Zubehör wirft ENODEV IOException”

    Also, während ich immer noch nicht alles verstehen, was los ist, implementiert ein Doppel-Puffer-System mein Problem behoben.

    Ich entdeckte, dass eine Java-Android-App mit voller Geschwindigkeit keine Probleme mit dem ENODEV-Problem hatte, was mich zu dem Schluss führte, dass die Java Native Interface die Wurzel meiner Probleme war.

    Früher las ich aus dem UsbAccessory direkt aus Methoden, die aus dem JNI in einer Polling-Mode genannt wurden. Etwas über den Übergang vom nativen Code zum Java und dann von Java auf den nativen Android-Kernel scheinbar alles mürrisch gemacht.

    Mein Fix war es, das UsbAccessory aus Java-only Threads zu lesen / zu schreiben (keine JNI-Aufrufe) und dann diese Daten zum Lesen / Schreiben von den von JNI aufgerufenen Methoden puffern.

    Scheint zu arbeiten wie ein Charme. Bevor ich die Zeitüberschreitungen sehr konsequent auf der Zubehörseite bekomme, und dann schließlich die IOExeception auf der Android-Seite, wie oben beschrieben, und jetzt bekomme ich keine Timeouts, keine IOExceptions. Ich bin immer noch ein wenig neugierig, was genau das Verhalten verursacht, aber ich vermute, es erfordert starke JNI Kung-fu zu verstehen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.