C++ und mobile Plattformen - Bada

2009-12-19 19:34

Im Oktober hatte ich ja schon über die Entwicklung auf mobilen Plattformen mit C++ geschrieben.
Samsung hat dann im November die neue Plattform Bada angekündigt, welche auch ein wohl neues OS als Basis hat. Wobei hier entweder ein Linuxkernel oder ein real-time OS als Fundament genutzt wird. Genaueres weiss man aber noch nicht.

Entwickelt wird für Bada vorerst ausschließlich mit C++. Bada beherrscht außerdem auch noch flash über flashlight.
Aber für "richtige" Anwendungen empfiehlt sich dann doch C++. Allerdings sollte man sagen, das auf Bada einige Einschränkungen gelten, zumindest erwähnt die API Dokumentation z.b. fehlenden Exceptionsupport, Fehlerbehandlung läuft z.T. über goto. Aber die STL wird man wohl verwenden können, auch könnten einfachere Boost Libs evtl. unter Bada dann laufen. Immerhin, und das finde ich lobenswert, benutzt Bada namespaces, etwas, was sich heute leider immer noch in viel zu wenigen Libraries und SDKs findet.

Steigen wir also ein, wie sieht es so aus, mit der Programmierung unter Bada?
Als erstes möchte ich erwähnen, das Samsung da bisher viel angekündigt hat, aber alle hier verwandten Quellen aus der Dokumentation oder aus Beispielen im Badadev Blog stammen. Samsung hat für Bada auch eine neue IDE auf Eclipse Basis entwickelt, allerdings ist das alles zur Zeit nicht verfügbar. Für mich schlägt die Anmeldung auf developer.bada.com sogar fehl, nicht nur weil alles voller JS ist (ohne JS funktioniert die Form nicht), sondern auch weil selbst nach korrektem Ausfüllen des Formulars ein Javaskriptfehler das Abschicken verhindert. Wer die IDE und das SDK installieren will, muss sich aber auf jedenfall auf badadev.com anmelden.

Einen Eindruck über die IDE verschafft dieser Blogbeitrag, welcher jedoch nicht die IDE zum Thema hat, sondern sich um eine erste, erweiterte GUI Anwendung für Bada dreht. Leider konnte ich nicht überprüfen, ob der generierte Code automatisch die Namespaces im Header öffnet, oder ob dies, wie später in den Examples immer wieder betont wird, nur der einfacheren Demonstration dient. Schön ist es natürlich nicht. IDE und SDK sind zur Zeit noch nicht erhältlich.

Initialisierung und Fehlerbehandlung


So, jetzt aber zum Code. Da wie gesagt, es keine Exceptions gibt, werden Fehler über Returnwerte zurückgegeben. Aber erstmal zur Initialisierung. In Bada erben die meisten Klassen von einer zentralen Objekt Klasse, ähnlich zu älteren Frameworks wie MFC, wxWidgets, oder Qt. Events werden i.d.R. auch über Vererbung realisiert, teilweise soll es aber möglich sein, einfach nur virtuelle Methoden zu überschreiben. Weil man in einem Constructor ja kein new benutzen kann, Samsung aber genau diese Methode zur Instanzerzeugung bevorzugt, wird hier ein Split zwischen Instantiierung und Initialisierung gemacht. Bada Objekte besitzen also i.d.R. noch eine result Construct() Methode, welche die Initialisierung regelt.
Und schon sind wir wieder bei der Fehlerbehandlung, denn für diesen gibt es den Typen result, im Code sieht dies dann so aus:
MyClass* myobject = new MyClass();
if(!myobject) return;
result r = myobject->Construct(); if(isFailed(r))
{
delete myobject;
/*Fehlerbehandlung*/
}

isFailed prüft hier den Wert von r. Im Erfolgsfall bekommt/gibt man E_SUCCESS zurück, alles andere ist ein Fehler. Mit GetLastResult bekommt man den letzten returnwert, dieser lässt sich auch mit SetLastResult setzen. Mit GetErrorMessage bekommt man einen char*, welcher auf die entsprechende Fehlermeldung zeigt. GetLastResult wird besonders interessant, wenn man keinen Resultwert zurück gibt, sondern zum Beispiel einen Zeiger, welcher im Fehlerfall null ist. Methoden die nichts(void) oder PODs (int,float usw.) zurückgeben, sollen auch keine Fehler enthalten, oder so ähnlich, steht es jedenfalls in der Doku:

 void (or primitive types) SomeClass::DoSomething()
    • Never throws an exception. Always succeeds.

Wenn man nun ein result oder einen anderen nicht POS Wert zurück bekommt, stellt Samsung 4 Möglichkeiten mit diesem umzugehen in seiner Doku vor:
  • r != E_SUCCESS (das gleiche wie isFailed(r))
  • GetLastResult() != E_SUCCESS (falls kein result zurückgegeben wird)
  • TryCatch(r == E_SUCCESS, r, "Fehlermeldung", GetErrorMessage(r)) (springt eine goto marke an, CATCH:)
  • TryReturn (ähnliche Parameter wie oben, gibt aber den 2. Parameter als return zurück)
Auch sollte man evtl. erwähnen, das eine Klasse ihre mit new erstellten Member im Destruktor wieder löschen muss. Dies gilt auch für Methoden welche am Ende ein N haben, und ein Objekt* zurückgeben. In wie weit sich hier Smartpointer nutzen lassen, ist noch unklar. Wäre aber eine Alternative zu x delete Statements.

Primitive Bada Standard Klassen


Bada enthält für einige Primitive Dinge eigene Standardklassen im namespace Base.
Dies sind:
  • Number (Basis für Integer, Float, Double, Long usw. usf.)
  • Boolean
  • Character
  • DateTime
  • TimeSpan
  • String
  • Uuid
  • BufferBase als Basis für Buffer und ByteBuffer
Als generelle Oberklasse dient hier wie erwähnt Object.
String enthält 2 Bytes pro Unicode Character, und bietet die Methoden Append, Insert, IndexOf, Remove, SubString, ToLower und ToUpper.
DateTime kann Daten von 0.00 Uhr 1.1.00 bis 23:59:59 31.12.9999 enthalten, TimeSpan enthält ein Zeitspanne in Millisekunden. Mit TimeSpan lässt sich auch rechnen, es ist auch möglich TimeSpan auf einen Zeitpunkt (DateTime) anzuwenden.
Buffer dient als Container für die oben aufgezählten Typen,  wobei davon abgeraten wird Buffer<int> oder Buffer<MyClass> zu verwenden, stattdessen wird zu den vordefinierten Buffern geraten (Diese gibt es für int, float,long, long long, double, short und 'mchar').

Als Container gibt es auch noch eine Sammlung an Collection Klassen, welche Maps, Lists, Vectoren, Deques und andere Container bietet.

Weitere Infos zum Core Modul (Timer, Threads, Mutexes, StringTokenizer/Util, Math, Uri usw.) finden sich in diesem PDF.

Das Map Beispiel


Ein weiterführendes Beispiel, welches im Blog von badadev.com zu finden ist, beschäftigt sich mit der Darstellung einer Karte in einer Bada Anwendung. Eine kurze Zusammenfassung, die Details kann ja jeder selber nachlesen :)
Im ersten Eintrag dieser kleinen Serie wird gezeigt, wie man eine Map in eine Anwendung einbindet. Dafür benötigt man einen weiteren Account, bei dem Anbieter (dies ist deCarta), welcher wohl das Map Interface für Bada liefert. Für mich ist hier z.B. unklar, ob man später nur über diese Account Informationen eine Map in eine Anwendung einbinden kann, oder ob dies über eine Schnittstelle im Telefon genauso möglich ist (welche den Login in die Map Schnittstelle regelt).
Die notwendigen Controls und Interfaces finden sich in den FLocation und FLocationControls Bibliotheken, den eigentlichen Map Service stellt dann das Interface IMapServiceProvider zur Verfügung, welcher neben der Fenstergröße dem Map Objekt in seiner Constructmethode übergeben wird.

Im zweiten Eintrag der Serie wird dann gezeigt, wie man in die Map zoomt, mittels der Softkeys. In Bada gibt es am Unteren Bildschirmrand 2 Softkeys, welche mit entsprechenden Funktionen belegbar sind. Über IActionEventListener kann man sich dann über entsprechende Events informieren lassen. Jedoch muss man in der OnActionPerformed Methode noch selber herausfinden, welcher Event es denn nun ist. Mit SetSoftkeyId kann man jedem Softkey eine ID zuweisen, und sich mit AddSoftkeyActionListener als Listener registrieren. Man bekommt also nur die Events, auf die man sich registriert hat. Für das Zoomen muss man dann noch den Zoomlevel entsprechend hoch oder runter setzen.

Im nächsten Teil wird dann erklärt, wie man seine eigene Position in der Karte anzeigen lassen kann. Dies geschieht mittels LocationProvider:
LocationProvider *locProvider = new LocationProvider();
locProvider->Construct(LOC_METHOD_GPS);
locProvider->RequestLocationUpdates(*this, 5, false);
Das Interface ILocationListener stellt dann entsprechend über OnLocationUpdated(Location& location) die eigene Position zur Verfügung.

Der vierte Teil zeigt schließlich, wie man auf eine Änderung der Orientation reagieren kann, um die Karte also im Hoch oder Querformat anzuzeigen. Hierfür gibt es das Interface IOrientationEventListener, welcher über
OnOrientationChanged(const Control& source, OrientationStatus orientation) entsprechende Benachrichtigungen anbietet.

Wahrscheinlich wird es noch weitere Beispiele in dieser Serie geben.

Fazit

Ingesamt gefällt mir Bada als mobile Lösung schon. Unklar ist zur Zeit noch einiges, der Code selber wirkt aber auf den ersten Blick manchmal etwas unsauber. Allerdings wird in den Blogbeiträgen immer wieder darauf hingewiesen das dies nur zu Demostrationszwecken sei. Hinterlässt trotzdem ein etwas komisches Gefühl. Ich finde hier macht Nokia mit Qt Mobility bei den Beispielen eine bessere Figur. Bada bietet ein spannendes Konzept, und verfügt über ein Framework welches alle mobilen Anwendungen ermöglichen dürfte, ähnlich wie Qt Mobility. Eine abschließende Beurteilung wäre aber zur Zeit zu früh, da man zur Zeit auch nur über die von Samsung vorgestellten Beispiele und die bereits verfügbare Dokumentation verfügt. Ich bin gespannt, wann man mit der IDE selber eigene Erfahrungen sammeln kann, und so ein Gefühl für die Praxistauglichkeit von Bada im Alltag und der Entwicklung bekommt.

Zurück