Mobile Cross-platform in C++ bouwen zonder C++ ervaring

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
We willen in de toekomst meer code-sharing gaan gebruiken tussen onze verschillende apps en de verschillende platforms waarop die draaien (tot nu toe iOS waar Android een beetje achter aan hobbelt maar Windows Phone moet ook mogelijk zijn later) en ik heb naar aanleiding van dit artikel over cross-platform libraries bedacht dat wij het wellicht ook in C++ kunnen doen.

Er wordt binnen het bedrijf waarschijnlijk een hackathon georganiseerd en ik wilde daarvoor een minimale proof-of-concept SDK opleveren in C++ met op zijn minst Objective-C bridges (niet strikt noodzakelijk vanwege Objective-C++ maar niet iedereen die het moet implementeren voelt zich op zijn gemakt met direct C++ aanroepen), een simpele implementatie in iOS en hopelijk ook Android bridges. En dan wilde ik één van onze JSON API's implementeren.

De grote onbekende voor mij is C++. Op papier voldoet C++ aan een hoop voorwaarden omdat het OO, cross-platform en snel is. Maar het schijnt een enorm grote taal te zijn en een hoop "moet je net weten" dingen te hebben. Aan de andere kant heb ik 80% waarschijnlijk niet nodig omdat ik gewoon business logic ga schrijven die wat API's consumeert en de code helemaal niet zo performance gevoelig is. Wellicht dat ik een simpele subset van C++ kan gebruiken?

Hoe groot wordt deze uitdaging als ik al gewend ben aan een IDE met C++ support (Visual Studio en Xcode, ga het waarschijnlijk in Xcode doen i.v.m. iOS implementatie), Objective-C dus ook een beetje C ervaring en 7 jaar ervaring met C#?

iOS developer


Acties:
  • 0 Henk 'm!

  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 14-09 12:44
Waarom pak je niet gewoon Xamarin? Dan kan je je C# ervaring houden.

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Omdat ik niet kan bepalen voor derde partijen wat voor platform of extra libraries zij moeten gebruiken. Hij moet makkelijk native integreren.

iOS developer


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:02
De 'core' van C++ is helegaar niet moeilijk, maar als je geavanceerd wilt doen dan kan dat ( met de onvermijdelijke geavanceerde bugs die er bij horen )

Is er iets waar je specifiek tegenaan loopt/tegenop ziet?

[ Voor 3% gewijzigd door farlane op 15-12-2014 20:23 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Ik wil binnen een korte tijd productief zijn en veilig werken met een redelijk beperkte set aan wensen. Ik weet niet of C++ dat wel toestaat omdat je aan zo veel dingen moet denken. In feit hoef ik niet veel meer te doen dan JSON om te zetten in objecten en vice versa, daar wat logica op los te laten en dat weer te transformeren naar de Java/Objective-C/C# wrappers.

Het introduceren van lastige bugs is niet echt iets wat ik kan gebruiken aangezien het een stuk code is wat over veel projecten gebruikt gaat worden.

[ Voor 17% gewijzigd door BikkelZ op 16-12-2014 13:15 ]

iOS developer


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Vraag je vooral of voor je toepassing C++ de geschikte taal is. Standaard bevat C++ bijvoorbeeld geen Json parser, die zul je dus zelf moeten maken of een library moeten compilen. Dan krijg je met dependencies te maken, die je misschien niet wilt omdat bijvoorbeeld op Android met de NDK niet alles zomaar gecompileerd krijgt, om maar wat te noemen.

Daarnaast is werken met JNI (de brug tussen Java en je C++ code) niet altijd een pretje. Al is het alleen al omdat je aan de ene kant met een garbage collected taal werkt, en aan de andere kant zelf je memorybeheer moet gaan doen.

Heb je bijvoorbeeld performance nodig en kun je al veel met de stdlib: gebruik C++, heb je geen pure performance nodig, en valt de gedeelde code eigenlijk ook wel mee: maak lekker 2 implementaties, of iets als Xamarin/whatever.

Acties:
  • 0 Henk 'm!

  • Gorion3
  • Registratie: Februari 2005
  • Laatst online: 24-08 08:28

Gorion3

ABC++

Ik kan met ervaring (ondertussen 3 jaar) aan geven dat C++ crossplatform prima werkt :) Onze game engine/framework draait op iOS, Android, Windows Phone 8 (en nog een sloot aan platformen) en is geschreven in C++.
Wij gebruiken visualGDB als plugin voor visual studio om met android & windows phone te werken en xCode voor iOS.

Het JNI gedeelte, zoals aangehaald, is geen pretje, maar dit hoef je maar 1x op te zetten en kan je dan gebruiken. Ik praat alleen vanuit een gamekant, dus enige wat ik nodig heb is een 'onDraw' call en dan zorg ik voor de rest, dus geen native UI elementen in gebruik.

Over libraries zoals een json parser hoef je je ook geen zorgen te maken, die hebben prima C++ parsers. Maar goed, als je veel native UI elementen gaat gebruiken dan weet ik ook niet of ik zal aanraden.

Awesomenauts! Swords & Soldiers


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
EddoH schreef op dinsdag 16 december 2014 @ 13:29:
Heb je bijvoorbeeld performance nodig en kun je al veel met de stdlib: gebruik C++, heb je geen pure performance nodig, en valt de gedeelde code eigenlijk ook wel mee: maak lekker 2 implementaties, of iets als Xamarin/whatever.
We zitten met drie devs die allemaal een zware C# achtergrond hebben en we willen niks liever doen dan Xamarin gebruiken maar we kunnen de afnemers van onze SDK niet verplichten Xamarin licenties aan te schaffen en een complete run-time toe te voegen alleen omdat wij graag Xamarin gebruiken. Als ik het mis heb laat het me weten.
Gorion3 schreef op dinsdag 16 december 2014 @ 14:49:
Ik kan met ervaring (ondertussen 3 jaar) aan geven dat C++ crossplatform prima werkt :) Onze game engine/framework draait op iOS, Android, Windows Phone 8 (en nog een sloot aan platformen) en is geschreven in C++.
Wij gebruiken visualGDB als plugin voor visual studio om met android & windows phone te werken en xCode voor iOS.

Het JNI gedeelte, zoals aangehaald, is geen pretje, maar dit hoef je maar 1x op te zetten en kan je dan gebruiken. Ik praat alleen vanuit een gamekant, dus enige wat ik nodig heb is een 'onDraw' call en dan zorg ik voor de rest, dus geen native UI elementen in gebruik.

Over libraries zoals een json parser hoef je je ook geen zorgen te maken, die hebben prima C++ parsers. Maar goed, als je veel native UI elementen gaat gebruiken dan weet ik ook niet of ik zal aanraden.
Ik had al een JSON parser gevonden inderdaad, ik had ook wel verwacht dat dat al zou bestaan. Welke library gebruiken jullie?

Ik wil een SDK met een API aanbieden, dus geen graphics, hooguit een plaatje uit bJSON converteren (yep }:| ). Bijvoorbeeld een API voor het aanschaffen van een bepaald product online, waarbij de klant die de API gebruikt zelf de UI native doet en alleen maar simpele calls hoeft aan te roepen en niet zelf alle data handling + exceptions hoeft te doen. Dus basale zaken als integers, strings, decimals, floats, objecten, arrays en dictionaries met hooguit een plaatje. Order getOrder(int orderNumber), void saveOrder(Order order)

Het enige spannende is dat het dus non-blocking moet zijn voor de UI dus liefst met callbacks moet werken.

Hoe zorgen jullie er voor dat de mensen die jullie engine gebruiken geen stabiliteitsproblemen ondervinden? Bepaalde veilige technieken?

iOS developer


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

BikkelZ schreef op dinsdag 16 december 2014 @ 15:59:
[...]


We zitten met drie devs die allemaal een zware C# achtergrond hebben en we willen niks liever doen dan Xamarin gebruiken maar we kunnen de afnemers van onze SDK niet verplichten Xamarin licenties aan te schaffen en een complete run-time toe te voegen alleen omdat wij graag Xamarin gebruiken. Als ik het mis heb laat het me weten.
Geen idee, geen ervaring met Xamarin, maar genoemd omdat dit eerder in het topic werd geopperd ;)
Er zullen meer cross-platform frameworks zijn; in plaats van Xamarin kun je daar dus een willekeurig framework invullen.

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
EddoH schreef op dinsdag 16 december 2014 @ 16:31:
[...]


Geen idee, geen ervaring met Xamarin, maar genoemd omdat dit eerder in het topic werd geopperd ;)
Er zullen meer cross-platform frameworks zijn; in plaats van Xamarin kun je daar dus een willekeurig framework invullen.
Ja maar we willen dus niet dat de partij die onze SDK gaat gebruiken gedwongen wordt allerlei extra libs toe te voegen en een "vreemde" syntax moet leren, dus we moeten alsnog gaan wrappen. Een Hello World in Xamarin voegt al 3MB aan libs toe, de hele zwik is 16MB.

Het zal voor andere frameworks niet veel verschillen. Dat is een heel verschil met een binary die gewrapt wordt.

[ Voor 8% gewijzigd door BikkelZ op 16-12-2014 16:55 ]

iOS developer


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Dan vallen frameworks dus wellicht af. Je originele vraag was of je wel C++ moest gebruiken voor je cross-platform lib omdat je wat opzag tegen de complexiteit die er met C++ kan ontstaan. Als een andere optie zoals een cross-platform framework geen keuze is vanwege dependencies/size,dan blijven er weinig andere opties over behalve voor elk platform een eigen implementatie maken.

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
EddoH schreef op dinsdag 16 december 2014 @ 17:17:
Dan vallen frameworks dus wellicht af. Je originele vraag was of je wel C++ moest gebruiken voor je cross-platform lib omdat je wat opzag tegen de complexiteit die er met C++ kan ontstaan. Als een andere optie zoals een cross-platform framework geen keuze is vanwege dependencies/size,dan blijven er weinig andere opties over behalve voor elk platform een eigen implementatie maken.
Ja wellicht dat ik meer geïnteresseerd was in de problemen die je als beginnende C++ programmeur in het algemeen en met cross-platform development voor mobile hebt. Er zijn meerdere wegen die naar Rome leiden maar mijn insteek van de hackathon zou C++ zijn. En dan met name vanwege het feit dat het lijkt te beloven dat het zonder allerlei frameworks en tools op alle platformen werkt.

[ Voor 7% gewijzigd door BikkelZ op 16-12-2014 20:19 ]

iOS developer


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ik zou gewoon beginnen met een simpel PoC, dan mark je vanzelf of het je bevalt. Grootste struikelpunt zal threading(ivm gewenste asynchroniteit) en memory management icm JNI worden denk ik.

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Threading? Is gewoon standaard C++ hoor, #include <thread> en je kunt de std::thread class gebruiken. Iets minder flexibel dan Java (er is geen Object.wait() in C++) maar daardoor wel zo efficient (classes waarop je niet wil synchroniseren hebben de overhead dus ook niet, pay for what you use)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • BoringDay
  • Registratie: Maart 2009
  • Laatst online: 13-05 21:49
BikkelZ schreef op dinsdag 16 december 2014 @ 13:15:
Ik wil binnen een korte tijd productief zijn en veilig werken met een redelijk beperkte set aan wensen. Ik weet niet of C++ dat wel toestaat omdat je aan zo veel dingen moet denken. In feit hoef ik niet veel meer te doen dan JSON om te zetten in objecten en vice versa, daar wat logica op los te laten en dat weer te transformeren naar de Java/Objective-C/C# wrappers.

Het introduceren van lastige bugs is niet echt iets wat ik kan gebruiken aangezien het een stuk code is wat over veel projecten gebruikt gaat worden.
Rad Studio (Delphi/C++ Builder) FireMonkey is misschien een optie.
Maar ik vrees er nog geen enkel cross platform bestaat die fatsoenlijke apps oplevert met native objecten (ipv gerenderd). Zelf hou ik het bij de toegewezen platformen uiteindelijk vaak minder werk en minder afhankelijkheden.

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

MSalters schreef op woensdag 17 december 2014 @ 18:17:
Threading? Is gewoon standaard C++ hoor, #include <thread> en je kunt de std::thread class gebruiken. Iets minder flexibel dan Java (er is geen Object.wait() in C++) maar daardoor wel zo efficient (classes waarop je niet wil synchroniseren hebben de overhead dus ook niet, pay for what you use)
Laatste keer dat ik in Android threads wilde gebruiken bevatte de NDK geen std::thread implementatie en moest ik POSIX threads gebruiken. Wellicht dat dat tegenwoordig anders is.

Overigens is threading met POSIX threads natuurlijk ook geen probleem, maar iets minder rechttoe rechtaan dan in C# of met std::thread, vooral zonder C++ ervaring, vandaar.

Edit: zie net dat std::thread wel ondersteund wordt in de nieuwere NDK versies.

[ Voor 5% gewijzigd door EddoH op 17-12-2014 21:58 ]

Pagina: 1