Auf Android mit C++ programmieren



  • 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