Auf Android mit C++ programmieren



  • User1234 schrieb:

    Meine Frage hierbei ist eigentlich, ob es sich lohnt C++ zu lernen um für Android zu programmieren, oder ob das ganze tatsächlich zu aufwändig ist und man lieber Java benutzen sollte.

    Zuerst einmal: C++ zu lernen ist tatsächlich aufwendig. SEHR aufwendig. Du solltest wissen, dass C++ eine der komplexesten Programmiersprachen überhaupt ist. Die Grundlagen der Sprache selbst lernst du typischerweise innerhalb einiger Monate, aber all die Idiome, Fallstricke und Möglichkeiten kommen erst mit der Zeit. Es hängt auch stark davon ab, ob du gute Bücher hast (viele zu C++ sind nämlich Schrott), und wie viele Projekte du machst, um Erfahrung zu sammeln.

    Auf der anderen Seite musst du natürlich sehen, dass du mit C++ von der Sprache her mehr Möglichkeiten als mit Java hast, weil dir mehr Abstraktionsmechanismen (Templates, Typedef, Operatoren, Funktionsobjekte, Mehrfachvererbung, freie Funktionen) und mehr Kontrolle (Zeiger, Ressourcenverwaltung/RAII, Unchecked Exceptions, generell weniger Vorschriften) zur Verfügung stehen. Java hat hingegen Reflection, massiv mehr Features in der Standardbibliothek und macht es schwieriger, Fehler zu machen.

    Ist halt die Frage, was du genau im Sinn hast. Wenn das Ziel ist, schnell ein Spiel zu schreiben, und du noch nicht gut C++ kannst, ist Java wohl die bessere Wahl, auch weil die Sprache auf Android ist. Wenn du dir C++ ohnehin aneignest, kannst du auch das versuchen -- ich würde vielleicht aber zuerst auf dem Desktop bleiben, wo du bessere Entwicklungs- und Debugmöglichkeiten hast. An Java kommst du aber ohnehin nicht vorbei, wenn du Android-Apps entwickelst.



  • [quote="Nexus"]

    User1234 schrieb:

    Auf der anderen Seite musst du natürlich sehen, dass du mit C++ von der Sprache her mehr Möglichkeiten als mit Java hast, weil dir mehr Abstraktionsmechanismen (Templates, Typedef, Operatoren, Funktionsobjekte, Mehrfachvererbung, freie Funktionen) und mehr Kontrolle (Zeiger, Ressourcenverwaltung/RAII, Unchecked Exceptions, generell weniger Vorschriften) zur Verfügung stehen. Java hat hingegen Reflection, massiv mehr Features in der Standardbibliothek und macht es schwieriger, Fehler zu machen.

    Das ist ja eben das, was mich stört. Ich habe schon mehrmals probiert mich ernsthaft mit Java zu beschäftigen, aber aus welchem Grund auch immer Gefällt mir dieser pure OOP-Stil einfach nicht. Nach einigen Tagen konnte ich Java schon kaum noch von einer Scriptsprache abgleichen, weil mein, wie du eben schon sagst kaum Freiheiten hat. Als ich angefangen habe C++ zu lernen, habe ich schon eine Herausforderung gespürt und mir persönlich macht es viel mehr Spaß C++ zu lernen.
    Der böse Nachteil ist eben leider, dass sich Google für Android und nicht für C++ entschieden hat. Kannst du mir bitte noch erläutern was damit gemeint ist :

    An Java kommst du aber ohnehin nicht vorbei, wenn du Android-Apps entwickelst.

    Meinst du damit, dass man eben das NDK braucht? Ich kenne mich in der Materie leider nicht sehr gut aus.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Administrator

    User1234 schrieb:

    Meinst du damit, dass man eben das NDK braucht? Ich kenne mich in der Materie leider nicht sehr gut aus.

    Mit dem NDK kannst du fast nur Bibliotheken entwickeln, welche in einem APK gepackt werden. Das APK muss dann mindestens ein bisschen Java enthalten, nämlich die Activity/GUI, welche gestartet wird und dann entsprechend deinen Native-Code aufruft. Theoretisch kann man auch ausführbare Dateien mit dem NDK erstellen, nur kann man diese dann nur über eine ADB Shell aufrufen, heisst nicht wirklich für den User verwendbar.

    Abgesehen davon sind die C++ Möglichkeiten auf Android auch beschränkt. SDL ist übrigens eine C Bibliothek. C++ oder C auf Android entwickeln sollte man nur, wenn man weiss was man macht. In den meisten Fällen macht Java deutlich mehr Sinn.

    Und wenn man sich nicht ständig darüber ärgert, dass alles in C++ deutlich besser geht, kann man sogar recht gut in Java programmieren. Ist reine Gewöhnungssache. Was du mit dem "Skriptsprache" meinst ist mir auch nicht so klar.



  • Dravere schrieb:

    Und wenn man sich nicht ständig darüber ärgert, dass alles in C++ deutlich besser geht, kann man sogar recht gut in Java programmieren. Ist reine Gewöhnungssache. Was du mit dem "Skriptsprache" meinst ist mir auch nicht so klar.

    Das ist als C++ - Programmierer meine Meinung, die muss natürlich kein anderer vertreten, aber ich habe genug Erfahrung mit Java und auch Java-Programmierern gesammelt um das behaupten zu können. Ich gebe euch ein simples Beispiel von einer alten (ziemlich blöden) Scriptsprache (AutoIt) :

    MsGBox(1, "Titel", "Text");
    

    Java :

    JOptionPane.showInputDialog(null, "Geben sie etwas ein: ");
    

    Nächste Sache wäre der garbage collector. Es ist ja alles schön und gut der Speicher wird für den Programmierer aufgeräumt. Meines Wissens nach kann man sich aber auch explizit (zumindest teilweise) um die Speicherverwaltung in Java kümmern. Die meisten hingegen denken sich : Garbage collector? Cool story I will use that stuff. Und siehe da, 80% der Java Programme auf meinem PC (sogar simple Programme die auf kleine Datenbanken basieren) laufen einer nur zum abwinken langsam, wohingegen andere Programme in C++ perfekt laufen.

    PS: Danke aber für die Antwort, warscheinlich werde ich mich auf IOS fixieren.



  • User1234 schrieb:

    Ich gebe euch ein simples Beispiel von einer alten (ziemlich blöden) Scriptsprache (AutoIt) :

    MsGBox(1, "Titel", "Text");
    

    Java :

    JOptionPane.showInputDialog(null, "Geben sie etwas ein: ");
    

    Was soll uns das Beispiel zeigen? Dass man in beiden Sprachen Funktionen aufruft, um Message-Boxes anzuzeigen? 😮

    User1234 schrieb:

    Meines Wissens nach kann man sich aber auch explizit (zumindest teilweise) um die Speicherverwaltung in Java kümmern.

    Nicht wirklich.

    User1234 schrieb:

    80% der Java Programme auf meinem PC (sogar simple Programme die auf kleine Datenbanken basieren) laufen einer nur zum abwinken langsam, wohingegen andere Programme in C++ perfekt laufen.

    Und wie kommst du darauf, dass alleine der GC daran schuld ist? Dafür kanns Dutzende andere Gründe geben, nicht zuletzt schlechte Programmierer... Gewisse GUI-Bibliotheken in Java sind aber auch nicht unbedingt für ihre Schnelligkeit bekannt.

    User1234 schrieb:

    PS: Danke aber für die Antwort, warscheinlich werde ich mich auf IOS fixieren.

    Objective-C? Gewaltiger Schritt vorwärts 🤡

    Im Ernst, mir scheint deine Abneigung gegenüber Java beruht vor allem auf Vorurteilen. Die Sprache hat ein paar Eigenheiten, aber wie Dravere sagt, man kann eigentlich gut damit arbeiten. Gibt auch ein paar nette Sachen, und der IDE-Support ist so gut wie sonst fast nirgends.



  • User1234 schrieb:

    An dieser Stelle frage ich mich aber zum Beispiel, wie ein derart erfolgreiches Spiel wie "Angry Birds" mit der SDL ( Simple direct media layer ) für Android entwickelt wurde.

    Meinst du "Angry Birds" wurde wegen SDL erfolgreich? 😕



  • Habe auch schon ein paar kleine Spiele für Android mit C++ programmiert.
    Als Einstieg empfehle ich das Buch: Beginning Android C++ Game Development
    Vor allem wird dort gut erklärt, wie man ein solches Projekt in Eclipse aufsetzt und wie man wichtige Dinge wie OpenGL überhaupt mal zum Laufen bekommt.

    Man kann die Apps rein in C++ schreiben, Google bietet einen "Glue Code", die ein oder zwei benötigten Java Klassen werden automatisch erstellt, und dann brauchst du nur noch in C++ programmieren.

    Gerade bei Spielen braucht man die Standard GUI von Android meist nicht. Die paar GUI Elemente, die man braucht, kann man recht leicht mit OpenGL zeichnen.

    Grundsätzlich macht es natürlich mehr Sinn, die "Standardsprache" zu verwenden, und die ist im Falle von Android nunmal Java.
    Aber wenn du C++ verwenden willst, so spricht da ja grundsätzlich auch nichts dagegen.



  • Wenn dir der Appstore-Mist egal ist, kannst du auch problemlos 'normale' C++-Programme für Android schreiben. Ohne den Umweg ein Shared Object über JNI aufrufen zu müssen.



  • Nexus schrieb:

    Auf der anderen Seite musst du natürlich sehen, dass du mit C++ von der Sprache her mehr Möglichkeiten als mit Java hast, weil dir mehr Abstraktionsmechanismen (Templates, Typedef, Operatoren, Funktionsobjekte, Mehrfachvererbung, freie Funktionen) und mehr Kontrolle (Zeiger, Ressourcenverwaltung/RAII, Unchecked Exceptions, generell weniger Vorschriften) zur Verfügung stehen.

    Zu Templates:

    Dafür hat man in Java ja Generics. Oder kann man das jetzt nicht ganz vergleichen?

    Zu Typedef:

    In C++ braucht man das ja, um seine eigenen Datentypen zu definieren, da die Datentypgröße auf jeder Architektur eine andere sein kann.
    int auf einem 16 Bit System ist also nicht gleich int auf einem 32 Bit System.
    Typedefs benutzt man in C++ daher, um seinen eigenen Datentyp zu definieren, der dann auf jeder Plattform gleich groß ist, weil man dann eben auf der anderen Plattform long int oder so nimmt, während auf der anderen ein int genügt und das alles dann unter einer Typedef Definition zusammengefasst wird.

    In Java sind die Datentypgrößen aber alle fest definiert.
    Daher sind ist so etwas wie typedef meiner Einschätzung nach dort unnötig.



  • Dravere schrieb:

    Und wenn man sich nicht ständig darüber ärgert, dass alles in C++ deutlich besser geht, kann man sogar recht gut in Java programmieren.

    Besser ist hier aber relativ.
    Denn mit Java kommt man meiner Einschätzung nach schneller in kürzerer Zeit ans Ziel, vorausgesetzt die Aufgabenstellung eignet sich für diese Programmiersprache.



  • C++ vs. Java schrieb:

    Denn mit Java kommt man meiner Einschätzung nach schneller in kürzerer Zeit ans Ziel, vorausgesetzt die Aufgabenstellung eignet sich für diese Programmiersprache.

    Du meinst eine Aufgabenstellung, in der keine Verben vorkommen? 😉



  • C++ vs. Java schrieb:

    Zu Templates:

    Dafür hat man in Java ja Generics. Oder kann man das jetzt nicht ganz vergleichen?

    Doch, kann man vergleichen, allerdings kommt beí dem Vergleich raus, dass Templates mächtiger sind.
    Auch wenn es mich in der Praxis nicht/selten stört.

    C++ vs. Java schrieb:

    Zu Typedef:

    In C++ braucht man das ja, um seine eigenen Datentypen zu definieren, da die Datentypgröße auf jeder Architektur eine andere sein kann...
    In Java sind die Datentypgrößen aber alle fest definiert.
    Daher sind ist so etwas wie typedef meiner Einschätzung nach dort unnötig.

    Typedefs machen den Code insbesondere lesbarer.
    Was in Java zugegeben nicht wichtig ist, in C++ aber unverzichtbar (siehe String)



  • Jockelx schrieb:

    C++ vs. Java schrieb:

    Zu Typedef:

    In C++ braucht man das ja, um seine eigenen Datentypen zu definieren, da die Datentypgröße auf jeder Architektur eine andere sein kann...
    In Java sind die Datentypgrößen aber alle fest definiert.
    Daher sind ist so etwas wie typedef meiner Einschätzung nach dort unnötig.

    Typedefs machen den Code insbesondere lesbarer.
    Was in Java zugegeben nicht wichtig ist, in C++ aber unverzichtbar (siehe String)

    Okay für Strings noch, aber ein Feature, welches in Java nicht notwendig ist, würde ich jetzt nicht als Vorteil von C++ anführen, wie es Nexus getan hat.



  • Naja, nicht nötig ist relativ:

    kann.import.nicht.nutzen.da.gleicher.klassenname k1;
    anderer.namespace.oder.wie.das.in.java.heisst.klassenname k2;
    ...
    k1 = new kann.import.nicht.nutzen.da.gleicher.klassenname();
    

    Da könnte man schon gut ein typedef brauchen.



  • Womit wir hier angelangt wären. 😃



  • C++ vs. Java schrieb:

    Zu Templates:

    Dafür hat man in Java ja Generics. Oder kann man das jetzt nicht ganz vergleichen?

    Java Generics sind wegen Type Erasure nur für Typsicherheit zur Kompilierzeit gut. Du kannst damit keine generische Programmierung im Sinne von statischer Polymorphie umsetzen. Du hast nicht einmal Typsicherheit zur Laufzeit, was in der sonst strikt laufzeitgeprüften Sprache eine beträchtliche Lücke darstellt.

    C++ vs. Java schrieb:

    Typedefs benutzt man in C++ daher, um seinen eigenen Datentyp zu definieren, der dann auf jeder Plattform gleich groß ist

    Nein, das ist nur ein Spezialfall. Typedefs sind ein Abstraktionsfeature. Du kannst damit von Typen abstrahieren, Aliase erstellen und bei Bedarf ohne Client-Code-Anpassungen die Implementierung auswechseln. Z.B. verschiedene STL-Container oder Iteratoren.

    Jockelx schrieb:

    Doch, kann man vergleichen, allerdings kommt beí dem Vergleich raus, dass Templates mächtiger sind.
    Auch wenn es mich in der Praxis nicht/selten stört.

    Mich schon. Ist relativ schwierig, in Java generischen Code zu schreiben -- Klassen und Interfaces eigenen sich nur beschränkt, gerade wenn sie fertig vorgegeben sind.

    Kürzlich gehabtes Beispiel: Ich benötigte eine Factory, die verschiedene von einer Basisklasse abgeleitete Objekte konstruieren sollte. C++:

    // einmal:
    template <typename T>
    std::unique_ptr<Base> create()
    {
        return std::make_unique<T>();
    }
    
    // pro Aufruf:
    x.registerFactory(&create<MeinTyp>);
    

    Java (der Fairheit halber gleicher Klammerstil, um Codemenge zu vergleichen):

    // einmal:
    interface Factory
    {
        Base create();
    }
    
    // pro Aufruf:
    x.registerFactory(new Factory()
    {
        @Override
        public Base create()
        {
            return new MeinTyp();
        }
    }
    

    Du kannst dir vorstellen, dass es bei etlichen verschiedenen Typen langsam nervig wird, das Interface jeweils erneut zu implementieren. Lambdas würden hier zwar das Syntaxproblem etwas minimieren, aber das grundlegende bleibt. Worauf es hinausläuft, ist dass man dauernd Reflection braucht, wenn man Boilerplate-Code vermeiden möchte -- was aus diversen Gründen auch nicht ideal ist.

    Und hier gehts ja noch, weil man nicht wirklich statische Polymorphie braucht. Wenn du aber eine bekannte Methode für unbekannte Typen aufrufen willst, müssen die in Java schon ein Interface implementiert haben. Haben sie das nicht, hast du entweder Pech gehabt oder kannst gross refactoren.

    C++ vs. Java schrieb:

    Okay für Strings noch, aber ein Feature, welches in Java nicht notwendig ist, würde ich jetzt nicht als Vorteil von C++ anführen, wie es Nexus getan hat.

    Du hast Recht, dass man Typedef in Java nicht so stark vermisst wie man es in C++ täte. Das hat mit dem allgemeinen Programmierparadigma zu tun, das viel weniger auf Generizität ausgerichtet ist und Abstraktion nur in der Form von Klassen kennt.


Anmelden zum Antworten