Android Android und native Standardeingabe und Standardausgabe

ColorFrog

Mitglied
Hallo,

welche Möglichkeiten gibt es die Texteingabe über das Edittext-Feld der Android-Umgebung in die Standardeingabe einer nativen C-Routine umzulenken. Und nach einer erfolgreichen Bearbeitung des Textes in der nativen C-Routine, die entsprechende Standardausgabe der C-Routine wieder in das Edittext-Feld wieder auszugeben?
 

ColorFrog

Mitglied
Ganz richtig, natürlich ist der Weg über das NDK zu nehmen. Allerdings würde ich gerne wissen, mit welchen Routinen des Android-SDK bzw. Android-NDK man das bewerkstelligt.

Es sollte ungefähr so ablaufen wie im folgenden Pseudo-Code:

...
...
native C_Routine_einlesen();
native C_Routine_ausgeben();
...
...
in = Java_Routine (Standardeingabe_der_nativen_C_Routine_einlesen);
out = Java_Routine (Standardausgabe_der_nativen_C_Routine_ausgeben);
...
...
EditText(in);
EditText(out);
 

ColorFrog

Mitglied
Ich bin dem aufgeführten Link gefolgt. Es behandelt aber nicht meine Problematik. Nach eigenen Recherchen, könnte ich mir aber durchaus vorstellen, dass die Sache doch nicht so knifflig ist wie ich dachte. Aber dennoch knifflig genug ist, um noch einmal diesen Aspekt zu thematisieren. Gibt es eine Möglichkeit folgenden Code editInput.getText().toString() in die Standardeingabe System.in zu schreiben. Und umgekehrt aus System.out in textResult.setText() reinzuschreiben?
 

schlingel

Gesperrter Benutzer
Ich bin mir nicht sicher ob du nicht doch die Techniken aus meinem verlinkten Post verwenden musst um stdin und stdout von der C-Lib dazu zu bringen aber mal blöd gefragt: Hast du's schon ausprobiert mit nem Reader- bzw. Writer-Objekt auf System.in und System.out zuzugreifen?
 

ColorFrog

Mitglied
So wie es aussieht lässt sich tatsächlich System.in nicht befüllen. Es lässt sich nur auslesen. Wogegen man in System.out nur Eingaben machen kann.

Der Link den du empfohlen hast, könnte die Lösung enthalten:

Java:
extern "C" void Java_com_test_yourApp_yourJavaClass_nativePipeSTDERRToLogcat(JNIEnv* env, jclass 
cls, jobject obj)
{
int pipes[2];
    pipe(pipes);
    dup2(pipes[1], STDERR_FILENO);
    FILE *inputFile = fdopen(pipes[0], "r");
    char readBuffer[256];
    while (1) {
        fgets(readBuffer, sizeof(readBuffer), inputFile);
        __android_log_write(2, "stderr", readBuffer);
    }
}

Welche native Android API müsste statt __android_log_write verwendet werden, um die Ausgabe in System.in bzw. System.out zu erhalten.

Da ich in Thread-Programmierung noch nicht so bewandert bin, stellt sich für mich die Frage ob im Java-Block tatsächlich ein neuer Thread erstellt werden muss und wie die Integration in Java im Allgemeinen aussehen muss?

Java:
new Thread() {
    public void run() {
        nativePipeSTDERRToLogcat();
    }
}.start();
 

schlingel

Gesperrter Benutzer
Prinzipiell ist die Frage ob du mit den System.in nicht sowieso schon den Output der C-Komponente bekommst. Die Benennung ist ja immer diametral, je nachdem wo man ist. Ansonsten nach stdout schreiben.

Puncto Thread: das ist nötig. Aber aufpassen wegen des syncs, du musst mit postUpdate der view arbeiten.
 

ColorFrog

Mitglied
Es scheint auch einen alternativen Weg zu geben, der die Nutzung von Pipes überflüssig macht, siehe dazu folgende Links:

http://http://developer.android.com/reference/java/io/FileDescriptor.html

http://http://developer.android.com/reference/java/io/FileInputStream.html

Wenn ich das richtig verstanden habe, bietet Java mit dem Filedescriptor über FileInputStream, FileOutputStream eben die Zugriffe zu stderr, stdin und stdout an.

Allerdings weiß ich nicht welche Objektkomponente von Android man nutzen kann, um in die Eingabe und Ausgabe zu schreiben. Es stellt sich die Frage, ob man etwa Edittext selber abwandeln muss, damit die Funktionalität passt.
 

schlingel

Gesperrter Benutzer
Genau das habe ich mit meinem vorherigen Post gemeint. System.in ist ja ein InputStream und System.out ein PrintStream. Siehe dazu die Doku.

Die Frage die sich da jetzt nur stellt ist, ob das stdout und stdin der C-Komponente vom System in die selben Streams gemapped wird. Wenn ja, musst du so vorgehen:

1. Für System.in einen Thread aufmachen der die ganze Zeit liest. Damit bekommst du den Output. Den gelesenen Text kannst du dann immer wenn etwas daherkommt an dein EditText anhängen.
2. Wenn du vom anderen EditText den Text an die Komponente schicken willst nimmst du einfach System.out.println(txtBx.getText().toString());

Allerdings weiß ich eben nicht ob das ohne dem Umbiegen funktioniert.
 

ColorFrog

Mitglied
Hallo Schlingel,

vielen Dank für deine meinem Anliegen entgegengebrachte Aufmerksamkeit.

Mir ist aber noch nicht ganz klar wie dein Vorschlag bei Punkt 1 funktionieren und als Code aussehen soll. Die Problematik, die ich habe ist einfach, dass die Eingabelogik von Java keine Möglichkeit anbietet Strings wie in C zum Beispiel über scanf() zum Einlesen anbietet.

Die normale in Java verwendete Eingabe- Ausgabelogik ist scheinbar getrennt von den Eingabekomponeten von Android wie beim Editext-Gefüge. Das bedeutet, soweit ich das sehe, dass der in eine Edittext eingebene Text nicht automatisch in Systen.in landet.

Der Code von Punkt 2 könnte funktionieren, indem man tatsächlich den Filedescriptor out als Korrespondenz für das stdout verwendet. Allerdings ist das alles bisher von mir bisher nur theoretisch betrachtet worden und gedanklich durchlaufen.

Mir ist dann allerdings noch einmal bei der Recherche in den Android-APIs eine weitere gute Möglichkeit aufgefallen, diie ich dich bitten würde, über folgenden Link anzusehen: ParcelFileDescriptor | Android Developers.

Da ist in einigen Methoden die Möglichkeit zur Nutzung von nativen Fildescriptoren. Es würde mich freuen wenn du dir Mühe machen würdest zu überlegen, welche Möglichkeiten sich dadurch ergeben. Immerhin, es scheint einen Weg zu geben.

In einem englischsprachigen Forum habe ich mein Anliegen zur Diskussion vorgetragen. Ich erhielt die Antwort, dass es überhaupt keine Möglichkeit gebe, da Android mit Linux als Basis (Dalvek JVM on top of kernel) anders aufgebaut sei als das übliche PC Linux (kernel + shell + window manager + ...). Aber dadurch das in den Android-APIs die Klasse ParcelFileDescriptor mit Ihrer Funktionalität vorhanden ist, nehme ich an, dass es auch einen eleganten Weg zur Lösung meines Anliegens geben sollte.
 

schlingel

Gesperrter Benutzer
Naja, das Problem mit scanf vs. EditText ist ja viel allgemeiner. Da geht es um den Unterschied zwischen imperativer Programmführung und Ereignis orientierter Programmführung.

Aber prinzipiell stellt sich die Frage warum das so nicht funktionieren sollte. Du musst eben dem Benutzer eine geeignete View basteln die der C Komponente den String per System.out.println schickt.

Soll der ganze String geschickt werden? Dann könntest du das einfach per Button machen. Also der Benutzer bekommt eine Textbox, gibt den String ein und drückt dann auf den Button und die C-Komponente wird angeworfen.

Puncto ParcelFileDescriptor, das ist doch auch nur eine Android-Version eines InputStreams, den InputStream hast du ja bereits mit System.in.

Ich würd da weniger denken und einfach mal ausprobieren ob du die Lösung nicht eh schon hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Dimax Web-Seite in native app convertieren mit Android Studio Android & Cross-Platform Mobile Apps 8
J Benachrichtigung Freigabe ab Android 14 Android & Cross-Platform Mobile Apps 1
J Android Benachrichtigung zum Zeitpunkt ers Android & Cross-Platform Mobile Apps 15
J Das Beispiel von Android erzeugt Fehler Android & Cross-Platform Mobile Apps 8
J Zeitdifferenzen unter Android 7 (API < 26) berechnen Android & Cross-Platform Mobile Apps 4
W Netzwerk Verbindungen Java Android Android & Cross-Platform Mobile Apps 107
Z Android IntelliJ Android & Cross-Platform Mobile Apps 2
M Repository bei Room-Database in Android Studio (Java) Android & Cross-Platform Mobile Apps 2
Android App auf das eigene Handy bekommen Android & Cross-Platform Mobile Apps 3
Alex IV Android App erstellen Android & Cross-Platform Mobile Apps 3
OnDemand CrossPlatform Kotlin iOs/Android Datenverbrauch Android & Cross-Platform Mobile Apps 2
W In Android Studio Integer an andere activities übergeben Android & Cross-Platform Mobile Apps 2
wladp Android Studio Room Database Android & Cross-Platform Mobile Apps 1
N "Schöne" Datatable in Android und setzen von Parametern von Textview im Code Android & Cross-Platform Mobile Apps 5
N Android game programmieren Android & Cross-Platform Mobile Apps 5
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
K BLE Komunikation mit Android studio und esp32 Android & Cross-Platform Mobile Apps 5
G Android UDP Kommunikation Android & Cross-Platform Mobile Apps 1
M Paper DB wird in Android Studio nicht erkannt Android & Cross-Platform Mobile Apps 7
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
T Android Android Augmented Faces in Java. Neue Landmarks erstellen Android & Cross-Platform Mobile Apps 1
K Android Android In-App-Purchase lädt nicht Android & Cross-Platform Mobile Apps 0
Besset Android http request an interne ip adresse funktioniert nicht Android & Cross-Platform Mobile Apps 8
J Is Android Development Head First Outdated? Android & Cross-Platform Mobile Apps 3
J Android Android Datenbankverbindung zum Raspberry Pi Android & Cross-Platform Mobile Apps 1
lolcore Android Studio -Download Documentation for Android SDK Android & Cross-Platform Mobile Apps 0
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
W Problem mit Android Studio Android & Cross-Platform Mobile Apps 0
W App Abo Android Android & Cross-Platform Mobile Apps 10
OSchriever Android Android MediaPlayer bei Anruf stoppen/pausieren Android & Cross-Platform Mobile Apps 2
OSchriever Auf onClick-Listener reagieren und Parameter übergeben (Android Studio) Android & Cross-Platform Mobile Apps 4
W removeNetwork Android App mit Spendenaktion fürs Tierheim! Android & Cross-Platform Mobile Apps 1
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
P undefinierbarer Fehler Android Android & Cross-Platform Mobile Apps 8
T Android ArrayList sortieren mit 2 Werten ohne thencomparing , Wie? Android & Cross-Platform Mobile Apps 10
W Variable überschreiben (Android Studio) Android & Cross-Platform Mobile Apps 2
ruutaiokwu Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
ruutaiokwu Android Warum muss man bei Android Studio immer 2x auf "Run" klicken damit die App auf dem Gerät startet Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android Wo das 'android.useAndroidX' property hinzufügen? Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
P Login und Registrierung Android Anzeige Android & Cross-Platform Mobile Apps 7
S Von JavaFx zu Android Android & Cross-Platform Mobile Apps 12
K Android to Pi | Websocket Problem Android & Cross-Platform Mobile Apps 3
ruutaiokwu Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu? Android & Cross-Platform Mobile Apps 33
M Komponenten positionieren in Android Studio 3.6.3 Android & Cross-Platform Mobile Apps 1
M Android Studio - Property-Fenster einblenden Android & Cross-Platform Mobile Apps 1
M Android Studio - App auf dem Smartphone testen Android & Cross-Platform Mobile Apps 7
M Barrierefreie Appentwicklung für Android - Suche Codebeispiele Android & Cross-Platform Mobile Apps 8
M Android Studio - Configuration fehlt Android & Cross-Platform Mobile Apps 20
M Wo kann ich das Android SDK herunterladen / wie kann ich es installieren Android & Cross-Platform Mobile Apps 3
M Unsupported class file major version 57 - Fehlermeldung bei Android Studio Android & Cross-Platform Mobile Apps 27
ruutaiokwu Android Studio (SDK) ANDROID_SDK_ROOT-Variable? Android & Cross-Platform Mobile Apps 5
O Web API in Android (JAVA) einbinden Android & Cross-Platform Mobile Apps 3
J Android Studio macht seltsame Sachen Android & Cross-Platform Mobile Apps 2
J Android 9.1 aber android Studio findet API22 Android & Cross-Platform Mobile Apps 0
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
lolcore android studio: fehler bei laden des emulators Android & Cross-Platform Mobile Apps 10
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
A Android-Studio: 2. Layout nach kurzer Zeit aufzeigen Android & Cross-Platform Mobile Apps 2
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
J Android Studio - ArrayList - Selected Item ermitteln Android & Cross-Platform Mobile Apps 13
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
T Bringen mir die Java-Basics irgendetwas für die Android-Programmierung Android & Cross-Platform Mobile Apps 4
J Was soll das bedeuten ? does not require android.permission.BIND_JOB_SERVICE permission Android & Cross-Platform Mobile Apps 7
A Android Studio: ImageView verpixelt Android & Cross-Platform Mobile Apps 2
J intend Service im Android Studio Android & Cross-Platform Mobile Apps 4
L Android Android Development eventuell mit Flutter Android & Cross-Platform Mobile Apps 1
S Android Layout - welchen Typ? Android & Cross-Platform Mobile Apps 3
T Fehler Android Studio: java.net.MalformedURLException: no protocol: http%3A%2F%2Fwww.mal ..... Android & Cross-Platform Mobile Apps 2
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L Android Android Contacts DB auslesen Android & Cross-Platform Mobile Apps 1
A Android Studio - App mit Nearby Android & Cross-Platform Mobile Apps 1
L Android content URI Datei einlesen Android & Cross-Platform Mobile Apps 9
N Android Game Background Service Android & Cross-Platform Mobile Apps 11
Jackii Android Android Studio Error im Testlauf ohne zu programmieren Android & Cross-Platform Mobile Apps 9
B Android Probleme mit Android Studio Android & Cross-Platform Mobile Apps 6
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
B Android Projekt für Android und IOS erstellen? Android & Cross-Platform Mobile Apps 5
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
J Android Snake Android & Cross-Platform Mobile Apps 15
J Android TaschenRechner Android & Cross-Platform Mobile Apps 22
I Das Problem mit der Tastatur... android:windowSoftInputMode="adjustPan" Android & Cross-Platform Mobile Apps 1
E Wie erhalte ich Zugriff auf das Microfon? (Android Studio) Android & Cross-Platform Mobile Apps 9
C Android Programmierung speziell oder einfach Java Buch kaufen? Android & Cross-Platform Mobile Apps 3
B Android Kein Zugriff auf Telefonspeicher (Android 6) Android & Cross-Platform Mobile Apps 1
T Android Equalizer für Android Android & Cross-Platform Mobile Apps 3
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
A Beginnen mit Serverkommunikatsion in Android Studio Android & Cross-Platform Mobile Apps 6
E Android Studio Android & Cross-Platform Mobile Apps 15
L Android Android Studio Setup killt Explorer Android & Cross-Platform Mobile Apps 3
K Android Videos rendern Android & Cross-Platform Mobile Apps 1
J Variable in strings.xml (Android Studio) Android & Cross-Platform Mobile Apps 0
B Android Android Studio lässt PC abstürzen Android & Cross-Platform Mobile Apps 3
B Android App Fehler Android & Cross-Platform Mobile Apps 21
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
G Android Push Notification Android & Cross-Platform Mobile Apps 2
Light Lux Fehlermeldung unter Android Studio Android & Cross-Platform Mobile Apps 1
D Android Android Apps direkt vom Handy aus programmieren? Android & Cross-Platform Mobile Apps 2
L Android Android Kalendar Tag Ansicht Android & Cross-Platform Mobile Apps 1

Ähnliche Java Themen

Neue Themen


Oben