[ Nedeljko @ 28.09.2010. 16:24 ] @
Trebao bih da radim za Android u C++ jeziku, pa me zanima odakle da počnem. Na guglovom sajtu sam našao uputstvo kako napraviti hello world java aplikaciju, ali ne ynam odakle da krenem sa C++ -om.
[ milanche @ 28.09.2010. 16:56 ] @
Pogledaj pod 'native development'.

Treba ti
- Android SDK

ne treba direktno, ali indirektno treba jer donosi gomilu infrastrukture koja ti je potrebna za Android
sta god da radis (emulator, adb utility,...).

- Android NDK (direktna podrska za C/C++)

imaj na umu da je podrska narocito za C++ prilicno limitirana u pogledu svega sto je Android tim
smatrao da donosi potencijalna ogranicenja brzine - u prvom redu STL (standard template library),
za koju srecom postoje neformalne distribucije Android NDK (uradi search na CrystaX - to je jedan
ruski programer, verovatno oficijelno zaposlen u Google koji odrzava svoju neformalnu varijantu NDK-a
koja sasvim dobro radi - izbacuje na kraju neki warning koji ne treba da te sekira).

- citanje dokumentacije koja ide uz Android NDK
Android ima prilicno specificno okruzenje - native kod (C/C++) se preko JNI moze povezati sa Java
kodom, uz uslov da se native kod nalazi u shared biblioteci (.so). Moguce je kreirati i native aplikaciju,
samo da bi je poterao, trebaju ti root privilegije (tj. da root-ujes svoj Android device), koje srecom
na emulatoru ne trebaju. Uglavnom, legalno priznata veza Android koda sa native kodom je jedino preko
shared biblioteke.

- Eclipse i/ili ant
Eclipse ima podrsku kroz poseban plugin koji treba da skines i instaliras za Android aplikacije. Ant je
alternativni nacin za kompajliranje (koji ja licno vise volim jer se tera sa komandne linije, i nekako mi
je elegantnije upasovao u okruzenje u kojem kombinujem native kod i Android Java kod. Bar jedno
od ova dva ti je potrebno da bi (bar u nominalnom slucaju) distribuirao svoj native kod na device,
koji po default-u biva distribuiran upakovan u kompletan app package.

U svakom ostalom aspektu, pisanje C/C++ koda na Androidu je apsolutno slican svakodnevnoj praksi
pisanja koda na Linux-u. Build system pociva na apsolutno istim principima - moguci su nest-ovani
makefile-ovi (Android.mk), a postoji podrska za standardne tipove projekata (shared lib, static lib,
application).


[Ovu poruku je menjao milanche dana 28.09.2010. u 18:06 GMT+1]
[ milanche @ 28.09.2010. 17:04 ] @
Debagovanje je malo sarenija prica.

Postoji milion pitanja na web-u i milion odgovora.

Zapanjujuce je koliko pogresnih informacija kruzi koje lakom proverom
(neke na prvi pogled) mozes da provalis da su ih pisali hvalisavi geek-ovi,
tipa 'ma daaa, kod mene sve radi, samo sam ubacio ovu liniju u ovaj fajl'

....suuure.....right.

Posle jednog praznicnog popodneva koje sam potrosio da provalim sta je
tu tacno a sta nije, napipao sam recept (koji sad nemam vremena da napisem)
ali cu mozda imati za vikend.

Android tim je trenutno dosao na pola u pruzanju podrske za debagovanje
koja je u biti prilicno automatizovana - ne treba rucno gotovo nista da radis
od tipicnih poteza (startovanje gdb servera, otvaranje portova na emulatoru
itd) - sve je to vec automatizovano, samo treba aktivirati par detalja u build-u,
koji ce omoguciti da se na target distribuira custom verzija gdbserver-a u kojoj
je embedded port na kojem ce da salje debug informaciju.

Problem koji trenutno postoji (zbog kojeg se debagovanje jos uvek zvanicno
ne podrzava) je sto se ne zna konkretna adresa instrukcionog polja u shared
biblioteci at run time (nego moras sam da pogledas gde je, pa da je onda
pasujes kao parametar gdb klijentu).

Drugi problem je sto recept trenutno dobro radi za C kod, ali jos uvek ne radi
za C++, jer iz nekog razloga ne uspeva da 'mangle' ili 'demangle' C++ simbole.
gdb ce proci kroz taj kod, ali neces uspevati da vidis nista od onoga sto se
inace moze videti (member variables, local variables, stack trace,...)

U krajnjem slucaju, do danas je kao jedina ziva alternativa preostalo da koristis
obican printf i da se oslanjas na svoje opste computer science znanje steceno
na uljudnijim razvojnim okruzenjima.

Edit: setih se da se moze osloniti i na crash stack frame report koji izbacuje
emulator, pa onda koristiti i addr2line alatku da se vidi na kojoj liniji u biblioteci
se desio crash. Eto, i to se moze dodati arsenalu debug alatki

[Ovu poruku je menjao milanche dana 28.09.2010. u 18:30 GMT+1]
[ Nedeljko @ 29.09.2010. 15:11 ] @
Sve je to super, samo što u tom NDK ja ne vidim nikakav kompajler.
[ milanche @ 29.09.2010. 17:18 ] @
Kompajler se zove

ndk-build

Predpostavljam da radis na nekom Linux-u ili eventualno na Mac-u.

Kresni konzolu , idi u direktorijum bilo koje sample aplikacije koja dolazi uz NDK (recimo Plasma),
i ukucaj 'ndk-build'. Po default-u ce da potrazi u istom direktorijumu subdirektorijum 'jni' u kojem
ocekuje da ti se nalazi ceo native kod + ekstra infrastruktura (Android.mk u prvom redu), i krenuce
da kompajlira sve unutar jni subfoldera (koji moze da ima kompleksnu strukturu koliko god ti hoces,
nebrojeno mnogo statickih i shared biblioteka, ali samo jedna od njih ce imati interfejs prema
java kodu, koji ce ga pozivati preko JNI-ja).

Rezultat kompajliranja native koda ce biti biblioteka smestena po default-u u /libs/armeabi/*.so

Da bi video taj kod da radi na targetu (tj. emulator ili neki hardver), treba da posle uspesnog
kompajliranja native koda da iskompajiras ostatak Android aplikacije (tj. Java deo koda). Kao
zavrsni stepen, ant (ili Eclipse) ce da dohvati kreiranu native shared library i da je upakuje sa
svime ostalim u package koji mozes da instaliras na target.

Instalacija se radi tako sto pokrenes target (startujes emulator ili prikacis hardver preko USB),
i ukucas 'adb install <package_name>'.

Un-instalacija je nesto drugacija - treba da znas package name koji sleduje Java konvenciju
za namespaces (com.nedeljko.tests.application1 ...ili tako nesto), pa ako je instalirana da
ukucas 'adb uninstall com.nedeljko.tests.application1'.

U svakom slucaju - nemoj da se razocaras ako stvari ne idu odmah kako treba. Ima sto i jedna
mala fora oko pocetka sa Androidom.

Preko nedelje imam malo vremena da pisem detaljnije, ali cu gledati (ako porodica i posao dozvole)
da za vikend sklopim neki dokument za pocetnike koji sve objasnjava u detalje. Ako si nestrpljiv,
sibni mi privatnu poruku (ne e-mail), pa cu da probam da ti odgovorim konkretnije.

[ Nedeljko @ 30.09.2010. 09:49 ] @
Meni je kod 100% C++. Nema ni "j" od jave.
[ milanche @ 30.09.2010. 15:36 ] @
Kako mislis da ga pokrenes na Androidu ?

OK - moze i to, samo predpostavljam da pises app za nekog imaginarnog
korisnika, koga ne verujem da ces da teras da obavezno root-uje svoj
telefon pre instaliranja tvoje aplikacije ?