Kā sākt izmantot C ++ kodu savā Android projektā

Pagājušajā gadā es uzstājos GDG DevFest Ankarā, Turcijā. Kopš tā laika es plānoju dalīties ar šo runu šeit. Tagad, kad esmu doktora grāda kandidāts un man ir mazliet vairāk laika, es šeit ievietoju šo amatu.

Ja vēlaties saņemt prezentāciju, tā ir pieejama manā diskā.

Iesildīties

Es gribētu sākt, izskaidrojot lietotnes izveidošanas procesu operētājsistēmā Android. Tā kā jums jāzina dažas pamata iekšējās lietas, šī tēma ir nedaudz tehniska.

Jums nav jāzina viss, kas parādīts augšējā attēlā, taču tā ir laba atsauce.

Tagad sakiet, ka rakstāt lietojumprogrammu Android, izmantojot Java. Jums būs:

  • šīs lietojumprogrammas pirmkodu
  • kaut kādi resursu faili (piemēram, attēli vai xml faili GUI sakārtošanai)
  • un, iespējams, daži AIDL faili, kas ir Java saskarnes, kas liek procesiem sarunāties savā starpā.

Iespējams, ka projektā izmantosiet arī citas bibliotēkas un ar tām saistītos failus.

Veidojot darbojošos lietotni, vispirms kopā jāapkopo šie pirmkodi. Kompilators radīs DEX failu, kuru pēc tam var nolasīt virtuālā mašīna. Šo mašīnlasāmo failu un kādu papildu informāciju par lietotni kopā iesaiņos pakotņu pārvaldnieks. Pēdējā pakete - tā sauktā APK pakete - ir pēdējā lietotne.

Šis ir Android pakotnes veidošanas process visvienkāršākajā izteiksmē.

Android izpildes laiks

Tagad parunāsim par darbības laiku. Jums ir lietotne, un, kad tā sāk darboties, mašīna to nolasa. Android ir divu veidu virtuālās mašīnas, lai palaistu lietotni. Es neieviesīšu veco, sauktu par Dalviku, jo šodien vairumā Android ierīču darbojas virtuālā mašīna ar nosaukumu Android Run Time, ART - tāpēc par to mēs šeit runāsim.

ART ir pirms laika (AOT) virtuālā mašīna. Tātad, ko tas nozīmē? Ļauj man paskaidrot. Kad jūsu lietotne sāk darboties pirmo reizi, tās kods tiek apkopots līdz mašīnkodam, kuru pēc tam var nolasīt īstā mašīna. Tas nozīmē, ka kods izpildes laikā netiek kompilēts pa daļām. Tas paildzina lietotnes instalēšanas laiku, vienlaikus samazinot akumulatora lietojumu.

Kopumā jūs uzrakstāt lietotni un pēc tam apkopojat to binārā kodā, kuru nolasa ART. Tad ART pārveido šo kodu par vietējo kodu, kuru var nolasīt pati ierīce.

ART & C ++

Ko darīt, ja jūs rakstāt Android lietotni, izmantojot Java, bet ir kāds C ++ kods, kas ir saskarē ar Java? Kāda ir šī C ++ koda ietekme uz jūsu lietotnes veidošanas procesu vai izpildes laiku? Ne pārāk daudz.

C ++ kodu kompilators tieši apkopo reālajā mašīnas kodā. Tātad, ja izmantojat C ++ kodu, tas jūsu iepakojumā tiks iesaiņots kā mašīnlasāms kods. ART to nepārstrādās, kamēr tas pirmo reizi pārveido ART lasāmu kodu mašīnlasāmā kodā. Jums nav jāuztraucas par šo procesu. Jūs esat atbildīgs tikai par saskarnes rakstīšanu, kas ļauj Java runāt ar C ++. Drīz par to runāsim.

C ++ Veidošanas process

Tagad mums ir jārunā par C ++ veidošanas procesu. Avota kodu (.cpp un .h failus) pirmapstrādātājs jau pirmajā solī pārvērš par izvērstu pirmkodu. Šis avota kods satur visu kodu. Lai gan jūs varat iegūt galīgo izpildāmo failu, izmantojot komandu, piemēram, iepriekš, ir iespējams samazināt izveidošanas darbības ar saistītajiem karodziņiem. Paplašināto avotu varat iegūt, piešķirot karodziņam -E kompilatoram g ++ . Man ir 40867 rindas fails 4 rindu “sveika pasaule” .cpp avota kodam.

Izmantojiet g ++ -E hello.cpp -o hello.ii, lai iegūtu paplašināto pirmkodu.

Otrais ir faktiskais apkopošanas solis. Sastādītājs apkopo mūsu kodu, lai iegūtu montētāja failu. Tātad reālā kompilācija dod asamblejas failu, nevis izpildāmo. Šo failu saliek montētājs. Iegūto kodu sauc par objekta kodu. Kad mums ir vairākas bibliotēkas, kuru mērķis ir būt savstarpēji saistīts, mums ir daudz objektu kodu. Šos objektu kodus saista saite. Tad mēs iegūstam izpildāmu failu.

Ir divu veidu sasaistīšana: dinamiska un statiska.

Tāpēc tagad ir pienācis laiks iedziļināties nedaudz dziļāk, kad mēs apspriežam tīras C ++ lietas.

Svarīgi: Jūs varat uzskatīt statiskas saistītas bibliotēkas par sava koda daļu. Tāpēc esiet piesardzīgs, saistot bibliotēku ar savu projektu. Tā kā jūsu izmantotajai bibliotēkai, iespējams, nav piemērotas licences statiskai saistīšanai. Lielākā daļa atvērtā pirmkoda bibliotēku ir ierobežotas, lai tās varētu izmantot kā dinamiski saistītas.

No tehniskā viedokļa sastādītājs ir saistīts ar statiski saistītu bibliotēku ar projektu būvēšanas laikā. No otras puses, dinamiski saistītu bibliotēku darbības laikā saista operētājsistēma. Tāpēc jums nav nepieciešams izplatīt savu projektu ar bibliotēkas kodu, kuru izmantojat. Varat izmantot arī cita projekta bibliotēku vai sistēmas bibliotēku.

Šī fakta dēļ dinamiska sasaiste var izraisīt jūsu projekta ievainojamību. Kaut arī drošības lieta ir ārpus šīs ziņas darbības jomas, tomēr.

Daži jēdzieni

CMake un Gradle

Ja mēs vēlamies pievienot C ++ kodu savam Android projektam, ir lietderīgi izmantot CMake, lai apstrādātu būvēšanas operācijas. Vai atceraties būvniecības procesu, kuru tikko ievadīju iepriekš? Kad jums ir virkne C ++ bibliotēku un pirmkodu, ir sarežģītāk rīkoties ar visām. Tāds rīks kā CMake atvieglo būvēšanas procesu.

CMake būs pieejams pēc noklusējuma, kad projekta sākumā izvēlēsieties iekļaut C ++ atbalstu. Jums arī jāizmanto Gradle aizvērējs, lai bibliotēkas iesaiņotu savā APK.

ABI

Kā jūs zināt, Android tiek izplatīts dažādām ierīcēm. Katrai ierīcei var būt atšķirīga procesora arhitektūra. Izstrādājot Android lietojumprogrammu, kas satur C ++ kodu, jums vajadzētu rūpēties par platformām, kurās darbosies jūsu lietojumprogramma.

Vai atceraties C ++ veidošanas mehānismu, kuru ieviesu iepriekš? C ++ kods jāapkopo kā bibliotēka katrai mērķa platformai. Jūs varat apkopot bibliotēku visām atbalstītajām platformām vai arī izvēlēties to apkopot tikai vienai platformai.

Lūdzu, ņemiet vērā, ka 64 bitu ABI atbalsts būs obligāts ar Android Pie laidienu, ja vēlaties savu lietotni ievietot Google Play veikalā.

JNI

Šī ir pēdējā lieta, ar kuru es vēlētos jūs iepazīstināt attiecībā uz C ++ lietošanu Android ierīcēs. Kā jau minēju iepriekš, es jūs iepazīstinu ar šiem jēdzieniem, ņemot vērā, ka vēlaties izstrādāt lietotni, izmantojot Java.

JNI ir Java vietējās saskarnes saīsinājums. Tas ļauj C ++ un Java daļām sarunāties savā starpā visvienkāršāk. Piemēram, ja vēlaties izsaukt funkciju no Java C ++, šim nolūkam jums vajadzētu uzrakstīt JNI saskarni.

Native-lib.cpp ir interfeiss, un tas savieno C ++ kodu ar Java kodu. Iepriekš minētajā piemērā vienīgais C ++ kods ir pats JNI. Tomēr jūs varat iekļaut bibliotēkas, kuras vēlaties izmantot, un ieviest funkciju, kas tās izsauc. Šo jauno funkciju var izsaukt no Java daļas. Tātad tas tādā veidā darbojas kā tilts.

Darāmās lietas, ja vēlaties to izmēģināt

Šeit jums ir visas nepieciešamās un pamatzināšanas, lai izmantotu C ++ savā Android projektā. Ja vēlaties to izmēģināt, šādi izveidojiet vienkāršu Android projektu ar C ++ kodu.

Zemāk redzamie attēli parāda soļus, lai sāktu šādu projektu. Pēc to pabeigšanas, iespējams, vēlēsities pārlasīt šo ziņu, lai modificētu un dziļāk izprastu mehānismu.

Šis ieraksts bija tikai ievads. Neaizmirstiet, ka ir vēl daudz ko iemācīties. Tomēr es centos jūs iepazīstināt ar vissvarīgākajām lietām par C ++ izmantošanas koncepciju.