[ 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. |
[ Nedeljko @ 28.09.2010. 16:24 ] @
[ 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 ? Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|