Kuinka aloittaa C ++ -koodin käyttö Android-projektissasi

Viime vuonna pidin puheen GDG DevFestissä Ankarassa, Turkissa. Olen suunnitellut jakavansa tämän puheen täällä. Nyt kun olen tohtorikoulutettava ja minulla on vähän enemmän aikaa, laitan viestin tänne.

Jos haluat saada esityksen, se on saatavana asemallani.

Lämmitellä

Haluaisin aloittaa selittämällä sovelluksen rakennusprosessin Androidissa. Koska sinun on tiedettävä joitain sisäisiä perusasioita, tämä aihe on jonkin verran tekninen.

Sinun ei tarvitse tietää kaikkea yllä olevassa kuvassa näkyvää - mutta se on hyvä viite.

Sano nyt, että kirjoitat Android-sovelluksen Java-sovelluksella. Sinulla on:

  • kyseisen sovelluksen lähdekoodi
  • jonkinlaiset resurssitiedostot (kuten kuvat tai xml-tiedostot käyttöliittymän järjestämistä varten)
  • ja ehkä joitain AIDL-tiedostoja, jotka ovat Java-rajapintoja, jotka saavat prosessit puhumaan keskenään.

Luultavasti aiot käyttää projektissasi myös muita kirjastoja ja niihin liittyviä tiedostoja.

Kun rakennat toimivaa sovellusta, koota ensin nämä lähdekoodit yhdessä. Kääntäjä tuottaa DEX-tiedoston, jonka sitten virtuaalikone voi lukea. Paketinhallinta pakkaa tämän koneellisesti luettavan tiedoston ja joitain lisätietoja sovelluksesta. Viimeinen paketti - nimeltään APK-paketti - on viimeinen sovellus.

Tämä on yksinkertaisin sanoin Android-paketin rakennusprosessi.

Android-käyttöaika

Puhutaan nyt ajoajasta. Sinulla on sovellus, ja kun se alkaa toimia, kone lukee sen. Androidilla on kahdenlaisia ​​virtuaalikoneita sovelluksen ajamiseksi. En esittele vanhaa, nimeltään Dalvik, koska tänään useimmat Android-laitteet käyttävät virtuaalikonetta nimeltä Android Run Time, ART - joten siitä puhumme täällä.

ART on ennenaikainen (AOT) virtuaalikone. Joten mitä se tarkoittaa? Anna minun selittää. Kun sovelluksesi alkaa toimia ensimmäistä kertaa, sen koodi kootaan konekoodiksi, jonka sitten oikea kone voi lukea. Tämä tarkoittaa, että koodia ei käännetä osittain ajon aikana. Tämä pidentää sovelluksen asennusaikaa ja vähentää samalla akun käyttöä.

Yhteenvetona, kirjoitat sovelluksen ja käännät sen sitten binäärikoodiksi, jonka ART lukee. Sitten ART muuntaa koodin natiivikoodiksi, jonka laite itse voi lukea.

ART & C ++

Entä jos kirjoitat Android-sovelluksen Java-sovelluksella, mutta Java-kosketuksessa on joitain C ++ -koodeja? Mikä on kyseisen C ++ -koodin vaikutus sovelluksesi rakennusprosessiin tai ajoaikaan? Ei liikaa.

Kääntäjä kääntää C ++ -koodin suoraan todelliseen konekoodiin. Joten jos käytät C ++ -koodia, se pakataan koneellesi luettavana koodina pakettiin. ART ei käsittele sitä uudelleen, kun se muuntaa ART-luettavan koodin koneellisesti luettavaksi koodiksi ensimmäisellä käyttökerralla. Sinun ei tarvitse huolehtia tästä prosessista. Olet vastuussa vain sellaisen käyttöliittymän kirjoittamisesta, jonka avulla Java voi puhua C ++: n kanssa. Aiomme puhua siitä pian.

C ++ koontiprosessi

Meidän on nyt puhuttava C ++ -kehitysprosessista. Lähdekoodi (.cpp- ja .h-tiedostot) muutetaan laajennetuksi lähdekoodiksi esiprosessorilla heti ensimmäisessä vaiheessa. Tämä lähdekoodi sisältää paljon koodia. Vaikka voit saada lopullisen suoritettavan tiedoston yllä olevan kaltaisen komennon avulla, on mahdollista leikata rakennusvaiheet siihen liittyvillä lipuilla. Voit saada laajennetun lähteen antamalla -E- lipun g ++- kääntäjälle. Minulla on 40867 rivitiedosto 4-riviselle 'hei maailma' .cpp-lähdekoodille.

Käytä g ++ -E hello.cpp -o hello.ii saadaksesi laajennetun lähdekoodin.

Toinen on varsinainen kokoamisvaihe. Kääntäjä kääntää koodin saadakseen assembler-tiedoston. Joten todellinen kokoelma tuottaa assembler-tiedoston, ei suoritettavaa. Tämän tiedoston kokoaa kokoonpanija. Tuloksena olevaa koodia kutsutaan objektikoodiksi. Kun meillä on useita kirjastoja, jotka on tarkoitus linkittää toisiinsa, meillä on monia objektikoodeja. Nämä kohdekoodit linkitetään linkkerillä. Sitten saamme suoritettavan.

Linkittämistä on kahdenlaisia: dynaaminen ja staattinen.

Joten nyt on aika mennä hieman syvemmälle keskustellessamme puhtaista C ++ -tavaroista.

Tärkeää: Voit pitää staattisia linkitettyjä kirjastoja osana koodiasi. Joten ole varovainen, kun linkität kirjaston projektiisi. Koska käyttämälläsi kirjastolla ei ehkä ole sopivaa lisenssiä staattiseen linkitykseen. Useimpien avoimen lähdekoodin kirjastojen käyttö on rajoitettu dynaamisesti linkitetyiksi.

Teknisestä näkökulmasta kääntäjä linkittää staattisesti linkitetyn kirjaston projektiin rakennuksen aikana. Toisaalta käyttöjärjestelmä linkittää dynaamisesti linkitetyn kirjaston ajon aikana. Joten sinun ei tarvitse jakaa projektiasi käyttämäsi kirjastokoodin kanssa. Voit käyttää myös toisen projektin kirjastoa tai järjestelmäkirjastoa.

Tämän vuoksi dynaaminen linkittäminen voi aiheuttaa haavoittuvuutta projektissasi. Vaikka turvatapaus ei kuulu tämän viestin soveltamisalaan.

Joitakin käsitteitä

CMake ja Gradle

Jos haluamme lisätä C ++ -koodin Android-projektiimme, on hyvä käyttää CMakea rakennustoimintojen käsittelemiseen. Muistatko rakentamisprosessin, jonka esitin juuri edellä? Kun sinulla on joukko C ++ -kirjastoja ja lähdekoodeja, kaikkien niiden käsittely on monimutkaisempaa. CMaken kaltainen työkalu helpottaa rakennusprosessin suorittamista.

CMake on oletusarvoisesti käytettävissä, kun päätät sisällyttää C ++ -tukea projektisi alkuun. Sinun on myös käytettävä Gradle-suljinta, jotta voit pakata kirjastoja APK: si.

BI

Kuten tiedät, Android on jaettu useille laitteille. Jokaisella laitteella voi olla erilainen suorittimen arkkitehtuuri. Kun kehität C ++ -koodia sisältävän Android-sovelluksen, sinun tulee huolehtia alustoista, joilla sovelluksesi toimii.

Muistatko C ++ -rakennemekanismin, jonka esitin edellä? C ++ -koodi tulisi koota kirjastoksi jokaiselle kohdealustalle. Voit koota kirjaston kaikille tuetuille käyttöympäristöille tai voit valita sen koota vain yhdelle alustalle.

Huomaa, että 64-bittinen ABI-tuki on pakollinen Android Pie -julkaisun yhteydessä, jos haluat laittaa sovelluksesi Google Play -kauppaan.

JNI

Tämä on viimeinen asia, jonka haluan esitellä teille koskien C ++ -käyttöä Androidissa. Kuten aiemmin mainitsin, esitän sinulle nämä käsitteet, koska haluat kehittää sovelluksen Java-sovelluksella.

JNI on lyhenne sanoista Java Native Interface. Sen avulla C ++ - ja Java-osat voivat puhua keskenään yksinkertaisimmilla termeillä. Esimerkiksi, jos haluat kutsua funktion Java-ohjelman C ++: sta, sinun on kirjoitettava JNI-käyttöliittymä tätä tarkoitusta varten.

Native-lib.cpp on käyttöliittymä ja se yhdistää C ++ -koodin Java-koodiin. Yllä olevassa esimerkissä ainoa C ++ -koodi on itse JNI. Voit kuitenkin sisällyttää haluamasi kirjastot ja toteuttaa toiminnon, joka kutsuu niitä. Tätä uutta toimintoa voidaan kutsua Java-osasta. Joten se toimii siltana tällä tavalla.

Tekemistä, jos haluat kokeilla sitä

Täällä sinulla on kaikki tarvittavat ja perustiedot C ++: n käyttämiseen Android-projektissasi. Jos haluat kokeilla sitä, voit luoda yksinkertaisen Android-projektin C ++ -koodilla.

Alla olevat kuvat esittävät vaiheet tällaisen projektin aloittamiseksi. Kun olet lopettanut ne, saatat haluta lukea tämän viestin uudelleen, jotta voit muokata ja ymmärtää mekanismia syvemmin.

Tämä viesti oli vain johdanto. Älä unohda, että opittavaa on paljon enemmän. Halusin kuitenkin esitellä sinulle tärkeimmät asiat C ++: n käytön käsitteestä.