Slik kommer du i gang med Android's Native Development Kit

Med lanseringen av Android Studio 2.2, har utviklingen av Android-applikasjoner som inneholder C ++-kode, blitt enklere enn noensinne. I denne veiledningen viser jeg deg hvordan du bruker Android Native Development Kit, som vanligvis kalles NDK, for å lage et innfødt C ++-bibliotek hvis funksjoner er tilgjengelige for Java-klasser.

Forutsetninger

For å kunne følge denne opplæringen trenger du følgende:

  • den nyeste versjonen av Android Studio
  • en grunnleggende forståelse av C ++-syntaks

1. Hvorfor skrive innfødt kode?

Som en tommelfingerregel, ville du utvikle en Android-applikasjon med bare Java. Å legge til C + + -kod øker kompleksiteten dramatisk og reduserer også dens bærbarhet. Ikke desto mindre er det noen grunner til at du fortsatt vil gjøre det:

  • For å maksimere ytelsen: Du kan forbedre ytelsen til et Android-program, men bare marginalt, ved å implementere CPU-intensive deler av forretningslogikken i C++.
  • For å bruke høyytelses-APIer: Implementeringer av API-spesifikasjoner som Vulkan Graphics og OpenSL ES er en del av NDK. Derfor har Android-spillutviklere en tendens til å bruke NDK.
  • Å bruke populære C / C ++ biblioteker: Det finnes mange C- og C ++-biblioteker der ute som ikke har Java-ekvivalenter. Hvis du vil jobbe med dem i Android-appen din, kan du bruke NDK til å gå.
  • Å gjenbruke koden: Så lenge det ikke inneholder noen plattformspesifikke avhengigheter, kan kode skrevet i C ++ brukes både i Android og iOS-applikasjoner, vanligvis med minimal endring. Hvis du utvikler en stor applikasjon og har til hensikt å støtte både iOS- og Android-plattformene, kan C ++ forbedre produktiviteten din.

2. Opprette et nytt prosjekt

I Android Studio 2.2 eller nyere kan du opprette nye prosjekter som støtter C ++-koden, ved hjelp av veiviseren for opprettelse av prosjekter.

Start med å starte Android Studio og trykk på Start et nytt Android Studio-prosjekt knappen på velkomstskjermbildet. På neste skjermbilde, gi søknaden et meningsfylt navn og sjekk Inkluder C + + -støtte felt.

I skjermbildet for aktivitetsskaping av veiviseren velger du Legg til ingen aktivitet alternativ. På den siste skjermen av veiviseren, kontroller at verdien av C + + Standard feltet er satt til Toolchain Standard og trykk på Bli ferdig knapp.

Android NDK og verktøyene det avhenger av, er ikke installert som standard. Derfor, når prosjektet er generert, ser du en feil som ser slik ut:

For å fikse feilen, gå til Verktøy> Android> SDK Manager og bytt til SDK verktøy tab.

I listen over tilgjengelige utviklerverktøy velger du begge CUtfør og NDK, og trykk på Søke om knapp.

Når installasjonen er fullført, start Android Studio på nytt.

3. Opprette et innfødt bibliotek

Et Android Studio-prosjekt som støtter C ++, har en ekstra kildekoden katalog kalt cPP. Som du kanskje har gjettet, må alle C ++-filer og biblioteker plasseres i den. Som standard har katalogen en fil som heter innfødte lib.cpp. For nå skal vi skrive alle våre C + + -koder inni den.

I denne opplæringen lager vi et enkelt innfødt bibliotek som inneholder en funksjon som beregner området for en sirkel ved hjelp av formelen πr². Funksjonen vil akseptere radius av sirkelen som en jdouble og returnere området som en jstring.

Begynn med å legge til følgende inkludere direktiver til filen:

#inkludere  #inkludere  #inkludere 

jni.h er en headerfil som inneholder flere makrodefinisjoner, typer, strukturer og funksjoner, som alle er uunnværlige når du arbeider med NDK. (JNI står for Java Native Interface, og dette er rammen som tillater Java Runtime å kommunisere med innfødt kode.) The string header fil er nødvendig fordi vi skal bruke jstring skriv inn i biblioteket vårt. De math.h headerfil inneholder verdien av π.

Som standard for å støtte polymorfisme, endrer C ++-kompilatoren navnene på alle funksjonene du definerer i koden din. Denne funksjonen blir ofte referert til som navnet mangling. På grunn av navnet mangling vil det føre til feil ved å ringe C ++-funksjonene fra Java-koden. For å unngå feilene kan du deaktivere manglende navn ved å definere funksjonene i en ekstern "C" blokkere.

ekstern "C" // Dine funksjoner må defineres // her

Navnene på C ++-funksjoner som er tilgjengelige via JNI, må ha følgende format:

  • De må ha en Java_ prefiks.
  • De må inneholde en manglet form av pakkenavnet der punktene erstattes med understreker.
  • De må inneholde navnet på den Java-klassen de tilhører.

I tillegg må du spesifisere synligheten til funksjonen. Du kan gjøre det ved å bruke JNIEXPORT makro. Konvensjonen inkluderer de fleste utviklere også JNICALL makro i funksjonsdefinisjonen, selv om den for øyeblikket ikke tjener noe formål i Android.

Følgende kode definerer en funksjon som kalles calculateArea, som kan nås fra en Java-klasse kalt Hoved aktivitet:

JNIEXPORT jstring JNICALL Java_com_tutsplus_mynativeapplication_MainActivity_calculateArea (JNIEnv * jenv, jobject self, jdouble radius) 

Merk at i tillegg til radiusen, aksepterer funksjonen også a JNIEnv type, som har verktøyfunksjoner du kan bruke til å håndtere Java-typer, og a jobject eksempel, som er en referanse til en forekomst av Hoved aktivitet. Vi skal selvfølgelig skape Hoved aktivitet senere i denne opplæringen.

Beregning av området er enkelt. Alt du trenger å gjøre er å multiplisere M_PI makro ved torget av radius.

jdouble område = M_PI * radius * radius;

Bare slik at du vet hvordan du håndterer strenger mens du jobber med JNI, la oss nå lage en ny streng som inneholder en melding som sier hva området er. For å gjøre det kan du bruke sprintf () funksjon.

char utgang [40]; sprintf (utdata, "Området er% f kvm", område);

Fordi Java ikke direkte kan håndtere en C ++-karaktergruppe, er funksjonen vår returtype jstring. Å konvertere produksjon array inn i a jstring objekt, må du bruke NewStringUTF () funksjon.

returnere jenv-> NewStringUTF (utgang);

På dette tidspunktet er vår C + + -kode klar.

4. Bruke det innfødte biblioteket

I det forrige trinnet så du at calculateArea () funksjonen må tilhøre Hoved aktivitet Java klasse. Start å lage klassen ved å høyreklikke på Java-pakkenavnet ditt og velge Fil> Ny> Tom aktivitet.

I dialogboksen som dukker opp, navngi aktiviteten Hoved aktivitet. Etter at du har forsikret deg om at Lanseringsaktivitet alternativet er merket, trykk på Bli ferdig knapp.

Det opprinnelige biblioteket må lastes før det kan brukes. Legg derfor til en statisk blokkere til klassen og last biblioteket med Loadlibrary () metode av System klasse.

statisk System.loadLibrary ("native-lib"); 

For å kunne bruke calculateArea () C ++-funksjonen inne i aktiviteten, må du erklære det som en innfødt metode.

privat innfødt String calculateArea (dobbel radius);

Du kan nå bruke calculateArea () Metode som vanlig Java-metode. For eksempel kan du legge til følgende kode i onCreate () metode for å beregne og skrive ut området av sirkel hvis radius er 5,5:

Log.d (TAG, calculateArea (5.5f));

Hvis du kjører appen, bør du kunne se følgende utdata i logcat vindu:

Konklusjon

I denne opplæringen lærte du hvordan du oppretter et innfødt C ++-bibliotek og bruker det i en Android-applikasjon. Det er verdt å merke seg at den opprinnelige byggeprosessen, som standard, genererer en egen .så fil for hver enkelt CPU-arkitektur som NDK støtter. Derfor kan du være sikker på at søknaden din vil kjøre på de fleste Android-enheter uten problemer.

For å lære mer om Android NDK foreslår jeg at du refererer til NDK Guide.

Og sjekk ut noen av våre andre opplæringsprogrammer og kurs på Android-utvikling!

  • Bakgrunnslyd på Android med MediaSessionCompat

    En av de mest populære bruksområder for mobile enheter er å spille av lyd gjennom musikkstrømstjenester, nedlastede podcaster eller et hvilket som helst antall lyd ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Ta bilder med din Android-app

    Google Play-butikken har dusinvis av kameraprogrammer, hver av dem gjør det mulig å ta bilder eller gjøre noe unikt med bildene fra ...
    Ashraff Hathibelagal
    Android SDK