Ich schreibe eine App, die im Grunde ein Wrapper rund um ein 250K JNI ist. Die JNI (eine Spiele-Engine) hat APIs wie handle_penUp (int x, int y). Manchmal muss der Benutzer den Benutzer innerhalb von handle_penUp() abfragen (über Rückrufe in Java-Code), sodass der Dialog, den ich zur Implementierung der Abfrage verwende, blockiert werden muss.Blockieren von Dialog aus JNI-Code
Ich verstehe, dass der Hauptthread der Ausführung nicht blockieren kann. Also habe ich einen zweiten Thread erzeugt, der alle JNI-Aufrufe durchführt, die zu Rückrufen führen könnten, die blockiert werden müssten. Innerhalb dieses zweiten Threads, wenn ich einen blockierenden Dialog aufstellen muss, rufe ich startActivityForResult() und dann accept() für einen Semaphor auf. Wenn onActivityResult() für den Haupt-Thread aufgerufen wird, ruft es release() für denselben Semaphor auf.
Dies funktioniert, wenn meine Abfrage als eine neue Aktivität implementiert ist, aber nicht wenn ich ShowDialog() innerhalb der vorhandenen Aktivität anzeigen möchte. Log-Nachrichten sagen mir, dass mein Thread einen Looper benötigt. Ich füge einen hinzu - und werde Informationen anhängen, ob es funktioniert - aber es fühlt sich an, als würde ich hier den falschen Weg gehen. Was ich brauche, ist ein Rezept für blockierende Dialoge (nützlich nur, weil jede andere Plattform sie hat und so portierter Code wird oft so funktionieren.)
wahrscheinlich blockieren, wie bei der Blockierung gegen non-blocking io hilft (der Anruf nicht zurückkehrt, bis es hat die angeforderte Eingabe erhalten oder ist fehlgeschlagen, im Gegensatz zu der sofortigen Rückgabe und dem Melden der Eingabe, wenn eine bereits in einem Puffer vorhanden war) –