Kaip pradėti naudoti C ++ kodą „Android“ projekte

Praėjusiais metais aš kalbėjau „GDG DevFest“ renginyje Ankaroje, Turkijoje. Nuo to laiko planavau čia pasidalinti ta kalba. Dabar, kai esu daktaro kandidatas ir turiu šiek tiek daugiau laiko, aš dedu įrašą čia.

Jei norite gauti pristatymą, jį galite rasti mano diske.

Apšilimas

Pirmiausia norėčiau paaiškinti programos kūrimo procesą „Android“. Kadangi jums reikia žinoti keletą pagrindinių vidinių dalykų, ši tema yra šiek tiek techninė.

Jums nereikia žinoti visko, kas parodyta aukščiau esančiame paveikslėlyje, tačiau tai yra gera nuoroda.

Dabar pasakykite, kad rašote „Android“ programą naudodami „Java“. Jūs turėsite:

  • tos programos šaltinio kodas
  • tam tikri išteklių failai (pvz., vaizdai arba xml failai, skirti GUI išdėstymui)
  • ir galbūt kai kurie AIDL failai, kurie yra „Java“ sąsajos, skatinančios procesus kalbėtis tarpusavyje.

Tikriausiai savo projekte taip pat naudosite papildomas bibliotekas ir su jomis susijusius failus.

Kuriant veikiančią programą, pirmiausia kartu sukompiliuokite tuos šaltinio kodus. Kompiliatorius duos DEX failą, kurį tada gali nuskaityti virtuali mašina. Šį mašinoje nuskaitomą failą ir tam tikrą papildomą informaciją apie programą pakuos paketų tvarkyklė. Galutinis paketas, vadinamas APK paketu, yra paskutinė programa.

Tai yra „Android“ paketo kūrimo procesas paprasčiausiais terminais.

„Android“ vykdymo laikas

Dabar pakalbėkime apie bėgimo laiko dalykus. Turite programą, kurią paleidus ją nuskaito mašina. Programai paleisti „Android“ turi dviejų rūšių virtualias mašinas. Nepateiksiu senojo, vadinamo „Dalvik“, nes šiandien dauguma „Android“ įrenginių valdo virtualią mašiną, vadinamą „Android Run Time“, ART - taigi apie tai ir kalbėsime čia.

ART yra anksčiau laiko (AOT) virtuali mašina. Taigi, ką tai reiškia? Leisk man paaiškinti. Kai jūsų programa pradeda veikti pirmą kartą, jos kodas sudaromas pagal mašininį kodą, kurį tada gali perskaityti tikroji mašina. Tai reiškia, kad kodas vykdymo metu nėra sudaromas iš dalies. Tai prailgina programos įdiegimo laiką ir sumažina baterijos naudojimą.

Apibendrinant, jūs parašote programą, tada ją sukompiliuojate į dvejetainį kodą, kurį skaito ART. Tada ART konvertuoja tą kodą į gimtąjį kodą, kurį gali nuskaityti pats įrenginys.

ART & C ++

Ką daryti, jei rašote „Android“ programą naudodami „Java“, bet yra tam tikras C ++ kodas, kuris liečia „Java“? Koks to C ++ kodo poveikis jūsų programos kūrimo procesui ar vykdymo laikui? Ne per daug.

C ++ kodą kompiliatorius surenka tiesiai į tikrąjį mašinos kodą. Taigi, jei naudojate C ++ kodą, jis bus supakuotas kaip mašinoje nuskaitomas kodas jūsų pakuotėje. ART jo neperdarys, kai pirmą kartą naudodamas ART perskaitomą kodą pavers mašinoje nuskaitomu kodu. Jums nereikia jaudintis dėl šio proceso. Jūs esate atsakingas tik už sąsajos, kuri leidžia „Java“ kalbėtis su „C ++“, rašymą. Netrukus apie tai kalbėsime.

C ++ komponavimo procesas

Dabar turime kalbėti apie C ++ kūrimo procesą. Pirmąjį žingsnį pirminis procesorius pirminį kodą (.cpp ir .h failus) paverčia išplėstiniu šaltinio kodu. Šiame šaltinio kode yra visa kodo partija. Nors galite gauti galutinį vykdomąjį failą naudodami tokią komandą, kaip pirmiau, galima sukonstruoti žingsnius su susijusiomis vėliavomis. Jūs galite gauti išplėstą šaltinį suteikiant -E vėliava su g ++ kompiliatorius. Turiu 40867 eilutės failą, skirtą 4 eilučių „labas pasauliui“ .cpp šaltinio kodui.

Norėdami gauti išplėstinį šaltinio kodą, naudokite g ++ -E hello.cpp -o hello.ii.

Antrasis yra tikrasis kompiliavimo žingsnis. Kompiliatorius surenka mūsų kodą, kad gautų surinkėjo failą. Taigi tikrasis kompiliavimas suteikia ne vykdytiną, o surinkėjo failą. Šį failą surenka surinkėjas. Gautas kodas vadinamas objekto kodu. Kai turime kelias bibliotekas, kurias siekiama susieti tarpusavyje, turime daug objektų kodų. Šiuos objektų kodus susieja susiejiklis. Tada mes gauname vykdomąjį failą.

Yra dvi susiejimo rūšys: dinaminė ir statinė.

Taigi dabar atėjo laikas pasidaryti šiek tiek giliau, kai aptarsime grynus C ++ dalykus.

Svarbus dalykas: statines susietas bibliotekas galite laikyti savo kodo dalimi. Taigi būkite atsargūs, susiedami biblioteką su savo projektu. Nes jūsų naudojama biblioteka gali neturėti tinkamos licencijos, kurią būtų galima susieti statiškai. Dauguma atvirojo kodo bibliotekų buvo naudojamos tik kaip dinamiškai susietos.

Techniniu požiūriu, kompiliatorius susieja statiškai susietą biblioteką su projektu kūrimo metu. Kita vertus, dinamiškai susietą biblioteką operacinė sistema susieja vykdymo metu. Taigi jums nereikia platinti savo projekto su naudojamu bibliotekos kodu. Taip pat galite naudoti kito projekto biblioteką arba sistemos biblioteką.

Dėl šio fakto dinaminis susiejimas gali sukelti pažeidžiamumą jūsų projekte. Nors saugumo byla nepatenka į šio įrašo taikymo sritį.

Kai kurios sąvokos

CMake ir Gradle

Jei norime pridėti C ++ kodą į savo „Android“ projektą, naudinga naudoti „CMake“, kad būtų galima tvarkyti kūrimo operacijas. Pamenate statybos procesą, kurį ką tik pristatiau aukščiau? Kai turite daugybę C ++ bibliotekų ir šaltinio kodo, tampa sudėtingiau jas visas tvarkyti. Toks įrankis kaip „CMake“ palengvina kūrimo procesą.

„CMake“ bus prieinama pagal numatytuosius nustatymus, kai pasirinksite įtraukti C ++ palaikymą savo projekto pradžioje. Taip pat turite naudoti „Gradle“ uždarymą, kad pakuotumėte bibliotekas į savo APK.

ABI

Kaip žinote, „Android“ yra platinamas įvairiems įrenginiams. Kiekvienas įrenginys gali turėti skirtingą procesoriaus architektūrą. Kurdami „Android“ programą, kurioje yra C ++ kodas, turėtumėte rūpintis platformomis, kuriose veiks jūsų programa.

Pamenate C ++ komponavimo mechanizmą, kurį įvedžiau aukščiau? C ++ kodas turėtų būti sudarytas kaip kiekvienos platformos, į kurią taikote, biblioteka. Galite sukompiliuoti biblioteką visoms palaikomoms platformoms arba pasirinkti ją sukompiliuoti tik vienai platformai.

Atminkite, kad 64 bitų ABI palaikymas bus privalomas leidžiant „Android Pie“, jei norite įdėti programą į „Google Play“ parduotuvę.

JNI

Tai paskutinis dalykas, kurį norėčiau supažindinti su C ++ naudojimu „Android“. Kaip jau minėjau anksčiau, pristatau jums šias sąvokas, atsižvelgiant į tai, kad norite sukurti programą naudodami „Java“.

JNI yra „Java Native Interface“ santrumpa. Tai leidžia C ++ ir Java dalims susikalbėti paprasčiausiais terminais. Pavyzdžiui, jei norite iškviesti funkciją iš „Java“ C ++, šiam tikslui turėtumėte parašyti JNI sąsają.

„Native-lib.cpp“ yra sąsaja ir ji sujungia C ++ kodą su „Java“ kodu. Ankstesniame pavyzdyje vienintelis C ++ kodas yra pats JNI. Tačiau galite įtraukti norimas naudoti bibliotekas ir įdiegti funkciją, kuri joms skambina. Šią naują funkciją galima iškviesti iš „Java“ dalies. Taigi jis tokiu būdu veikia kaip tiltas.

Ką daryti, jei norite tai išbandyti

Čia jūs turite visas būtinas ir pagrindines žinias, kad galėtumėte naudoti „C ++“ savo „Android“ projekte. Jei norite pabandyti, taip galite sukurti paprastą „Android“ projektą su C ++ kodu.

Žemiau pateiktuose paveikslėliuose parodyti žingsniai norint pradėti tokį projektą. Baigę juos, galbūt norėsite perskaityti šį įrašą, kad galėtumėte giliau modifikuoti ir suprasti mechanizmą.

Šis įrašas buvo tik įvadas. Nepamirškite, kad reikia išmokti dar daug dalykų. Tačiau siekiau supažindinti jus su svarbiausiais dalykais apie C ++ naudojimo koncepciją.