Kuidas C ++ koodi oma Android-projektis kasutama hakata

Eelmisel aastal pidasin Türgis Ankaras GDG DevFestil ettekande. Sellest ajast olen plaaninud seda juttu siin jagada. Nüüd, kui olen doktorikandidaat ja mul on natuke rohkem aega, panen postituse siia.

Kui soovite esitlust saada, on see saadaval minu draivil.

Üles soojenema

Alustuseks tahaksin selgitada Androidi rakenduse loomise protsessi. Kuna peate teadma põhilisi sisemisi asju, on see teema mõnevõrra tehniline.

Te ei pea teadma kõike, mis on näidatud ülaltoodud pildil, kuid see on hea viide.

Nüüd öelge, et kirjutate Java-rakenduse Androidi jaoks. Teil on:

  • selle rakenduse lähtekood
  • mingisugused ressursifailid (näiteks graafilise kasutajaliidese korraldamiseks pildid või xml-failid)
  • ja võib-olla mõned AIDL-failid, mis on Java-liidesed, mis panevad protsessid omavahel rääkima.

Tõenäoliselt kavatsete oma projektis kasutada ka täiendavaid teeke ja nendega seotud faile.

Töötava rakenduse ehitamisel koostate need lähtekoodid kõigepealt koos. Kompilaator annab DEX-faili, mida seejärel saab virtuaalmasin lugeda. Selle masinloetava faili ja rakenduse kohta lisateavet pakendab paketihaldur. Lõplik rakendus - nn APK-pakett - on viimane rakendus.

See on kõige lihtsamalt öeldes Androidi paketi koostamisprotsess.

Androidi tööaeg

Räägime nüüd jooksuaja asjadest. Teil on rakendus ja kui see töötab, loeb seda masin. Androidil on rakenduse käitamiseks kahte tüüpi virtuaalmasinaid. Ma ei tutvusta vana, nimega Dalvik, kuna täna töötab enamus Android-seadmeid virtuaalmasinat nimega Android Run Time, ART - nii et sellest me siin räägime.

ART on aeg-ajalt (AOT) virtuaalne masin. Mida see siis tähendab? Las ma selgitan. Kui teie rakendus hakkab esimest korda töötama, kompileeritakse selle kood masinakoodiks, mida seejärel saab reaalne masin lugeda. See tähendab, et koodi ei koostata käitamise ajal osade kaupa. See pikendab rakenduse installiaega ja vähendab aku tarbimist.

Kokkuvõttes kirjutate rakenduse ja seejärel kompileerite selle binaarkoodiks, mida ART loeb. Seejärel teisendab ART selle koodi algkoodiks, mida seade ise saab lugeda.

ART & C ++

Mis siis, kui kirjutate Androidi rakenduse Java abil, kuid Java-ga on kontaktis mõni C ++ kood? Milline on selle C ++ koodi mõju teie rakenduse koostamisprotsessile või käitamisajale? Mitte liiga palju.

C ++ koodi kompileerib selle koostaja otse reaalsesse masinakoodi. Seega, kui kasutate C ++ koodi, pakitakse see teie paketti masinloetava koodina. ART ei töötle seda uuesti, kui ta muundab ART-i poolt loetava koodi esmakordsel kasutamisel masinloetavaks koodiks. Selle protsessi pärast ei pea te muretsema. Teie vastutate ainult liidese kirjutamise eest, mis võimaldab Java-l rääkida C ++ -ga. Sellest räägime varsti.

C ++ koostamisprotsess

Nüüd peame rääkima C ++ koostamisprotsessist. Lähtekood (failid .cpp ja .h) muudetakse eeltöötleja poolt esimeses etapis laiendatud lähtekoodiks. See lähtekood sisaldab tervet hulka koode. Ehkki lõpliku käivitatava faili saate hankida ülaltoodud käsu abil, on võimalik ehitada samme seotud lippudega. Saad laiendatud allikas andes -E lipp g ++ kompilaator. Mul on 40867 reafail 4-realise "tere maailm" .cpp lähtekoodi jaoks.

Laiendatud lähtekoodi saamiseks kasutage g ++ -E hello.cpp -o hello.ii.

Teine on tegelik koostamisetapp. Koostaja kompileerib meie koodi, et saada assembleri fail. Niisiis annab tegelik kompileerimine assembleri faili, mitte käivitatava faili. Selle faili paneb kokku monteerija. Saadud koodi nimetatakse objekti koodiks. Kui meil on mitu teeki, mille eesmärk on olla omavahel ühendatud, on meil palju objektikoode. Neid objektikoode seob linker. Siis saame käivitatava faili.

Linkimist on kahte tüüpi: dünaamiline ja staatiline.

Nii et nüüd on aeg minna veidi sügavamale, kui arutame puhtaid C ++ asju.

Oluline on see, et saate staatiliselt lingitud teeke pidada oma koodi osaks. Nii et olge raamatukogu oma projektiga linkimisel ettevaatlik. Kuna teie kasutataval teegil ei pruugi staatiliselt linkimiseks sobivat litsentsi olla. Enamik avatud lähtekoodiga teeke on piiratud kasutamiseks dünaamiliselt lingituna.

Tehnilisest vaatepunktist seob kompilaator staatiliselt lingitud teegi projektiga ehitamise ajal. Teiselt poolt seob dünaamiliselt lingitud teegi käitamise ajal opsüsteem. Nii et teil pole vaja oma projekti levitada kasutatava teegi koodiga. Võite kasutada ka teise projekti teeki või süsteemiteeki.

Selle fakti tõttu võib dünaamiline linkimine põhjustada teie projektis haavatavust. Kuigi turvajuhtum jääb selle postituse reguleerimisalast välja.

Mõned mõisted

CMake ja Gradle

Kui tahame oma Android-projekti lisada C ++ koodi, on ehitustoimingute haldamiseks hea kasutada CMake'i. Kas mäletate ehitamisprotsessi, mille ma just eespool tutvustasin? Kui teil on hunnik C ++ teeke ja lähtekoodi, on nende kõigi käsitsemine keerulisem. Tööriist nagu CMake hõlbustab koostamisprotsessi.

CMake on vaikimisi saadaval, kui otsustate lisada oma projekti alguses C ++ toe. Samuti peate teekide APK-sse pakkimiseks kasutama Gradle'i sulgurit.

ABI

Nagu teate, levitatakse Androidi mitmesuguste seadmete jaoks. Igal seadmel võib olla erinev protsessori arhitektuur. C ++ koodi sisaldava Androidi rakenduse väljatöötamisel peaksite hoolima platvormidest, millel teie rakendus töötab.

Kas mäletate C ++ ehitusmehhanismi, mille ma eespool tutvustasin? C ++ kood tuleks koostada iga sihitud platvormi teegina. Teegi saate kompileerida kõigi toetatud platvormide jaoks või valida selle kompileerimise ainult ühe platvormi jaoks.

Pange tähele, et 64-bitine ABI tugi on Android Pie väljaandmisel kohustuslik, kui soovite oma rakenduse Google Play poodi panna.

JNI

See on viimane asi, mida tahaksin teile Androidi C ++ kasutamise kohta tutvustada. Nagu ma juba varem mainisin, tutvustan teile neid mõisteid, arvestades, et soovite Java-rakendust arendada.

JNI on Java Native Interface'i lühend. See võimaldab C ++ ja Java osadel üksteisega kõige lihtsamalt rääkida. Näiteks kui soovite Java-sse funktsiooni kutsuda C ++ -st, peaksite selleks kirjutama JNI-liidese.

Native-lib.cpp on liides ja see ühendab C ++ koodi Java koodiga. Ülaltoodud näites on ainus C ++ kood JNI ise. Siiski saate lisada teegid, mida soovite kasutada, ja rakendada funktsioon, mis neid kutsub. Seda uut funktsiooni saab kutsuda Java-osast. Nii et see töötab sel viisil sillana.

Toimingud juhuks, kui soovite seda proovida

Siin on teil kõik vajalikud ja põhiteadmised C ++ kasutamiseks oma Android-projektis. Kui soovite seda proovida, saate nii luua lihtsa C ++ koodiga Androidi projekti.

Allolevatel piltidel on toodud sammud sellise projekti alustamiseks. Pärast nende lõpetamist võiksite selle postituse üle lugeda, et mehhanismi sügavamalt muuta ja mõista.

See postitus oli ainult sissejuhatus. Ärge unustage, et õppida on veel palju asju. Püüdsin siiski tutvustada teile kõige olulisemaid asju C ++ kasutamise kontseptsiooni kohta.