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.
For å kunne følge denne opplæringen trenger du følgende:
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:
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.
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:
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.
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:
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!