Så här börjar du med Androids Native Development Kit

Med lanseringen av Android Studio 2.2 har det blivit enklare än någonsin att utveckla Android-program som innehåller C ++-kod. I den här handledningen visar jag dig hur du använder Android Native Development Kit, som vanligen kallas för bara NDK, för att skapa ett inbyggt C ++-bibliotek vars funktioner är tillgängliga för Java-klasser.

förutsättningar

För att kunna följa denna handledning behöver du följande:

  • den senaste versionen av Android Studio
  • en grundläggande förståelse för C ++-syntaxen

1. Varför skriva inlandsnummer?

Som en tumregel skulle du utveckla en Android-applikation med bara Java. Att lägga till C + + -kod ökar sin komplexitet dramatiskt och minskar också dess bärbarhet. Ändå är det några anledningar till varför du fortfarande vill göra det:

  • För att maximera prestanda: Du kan förbättra prestanda för en Android-applikation, men endast marginellt, genom att implementera CPU-intensiva delar av dess affärslogik i C++.
  • Använda högpresterande API: er: Implementeringar av API-specifikationer som Vulkan Graphics och OpenSL ES är en del av NDK. Därför tenderar Android-spelutvecklare att använda NDK.
  • Att använda populära C / C ++-bibliotek: Det finns många C- och C ++-bibliotek där ute som inte har några Java-ekvivalenter. Om du vill arbeta med dem i din Android-app, är NDK vägen att gå.
  • Att återanvända kod: Så länge det inte innehåller några plattformsspecifika beroenden kan kod som skrivs i C ++ användas i både Android och iOS-applikationer, vanligtvis med minimala ändringar. Om du utvecklar en stor applikation och har för avsikt att stödja både iOS- och Android-plattformarna, kan C ++ förbättra din produktivitet.

2. Skapa ett nytt projekt

I Android Studio 2.2 eller senare kan du skapa snabba nya projekt som stödjer C ++-koden.

Börja med att starta Android Studio och tryck på Starta ett nytt Android Studio-projekt knappen på välkomstskärmen. På nästa skärm, ge din ansökan ett meningsfullt namn och kolla Inkludera C ++ Support fält.

På skärmen för aktivitetsskapande av guiden väljer du Lägg till ingen aktivitet alternativ. På den slutliga skärmen av guiden, se till att värdet på C + + Standard fältet är inställt på Toolchain Standard och tryck på Avsluta knapp.

Android NDK och verktygen som det beror på är inte installerade som standard. Så snart projektet har genererats ser du ett fel som ser ut så här:

För att åtgärda felet, gå till Verktyg> Android> SDK Manager och växla till SDK-verktyg flik.

I listan över tillgängliga utvecklingsverktyg väljer du båda CMake och NDK, och tryck på Tillämpa knapp.

När installationen är klar startar du om Android Studio.

3. Skapa ett inbyggt bibliotek

Ett Android Studio-projekt som stöder C ++ har en extra källkodskatalog som heter cpp. Som du kanske har gissat måste alla C ++-filer och bibliotek placeras inuti den. Som standard har katalogen en fil som heter nativ lib.cpp. För nu ska vi skriva all vår C ++-kod inuti den.

I denna handledning skapar vi ett enkelt inbyggt bibliotek som innehåller en funktion som beräknar området för en cirkel med formeln πr². Funktionen kommer att acceptera cirkelns radie som en jdouble och returnera området som en jstring.

Börja med att lägga till följande inkludera Direktiv till filen:

#inkludera  #inkludera  #inkludera 

jni.h är en huvudfil innehållande flera makrodefinitioner, typer, strukturer och funktioner, vilka alla är oumbärliga när du arbetar med NDK. (JNI står för Java Native Interface, och det här är det ramverk som tillåter Java Runtime att kommunicera med inbyggd kod.) sträng header fil är nödvändig eftersom vi kommer att använda jstring skriv i vårt bibliotek. De math.h header-filen innehåller värdet på π.

Som standard för att stödja polymorfismen, ändrar C ++-kompilatorn namnen på alla funktioner du definierar i din kod. Den här funktionen kallas ofta namngivning. På grund av att namnet manglar, leder det till fel när du ringer dina C ++-funktioner från Java-koden. För att undvika fel kan du inaktivera namnfel genom att definiera dina funktioner i en extern "C" blockera.

extern "C" // Dina funktioner måste definieras // här

Namnen på C ++-funktioner som är tillgängliga via JNI måste ha följande format:

  • De måste ha en Java_ prefix.
  • De måste innehålla en manglad form av paketnamnet där prickarna ersätts med understreck.
  • De måste innehålla namnet på den Java-klass de tillhör.

Dessutom måste du ange synligheten för funktionen. Du kan göra det med hjälp av JNIEXPORT makro. Enligt konventet innehåller de flesta utvecklare också JNICALL makro i funktionsdefinitionen, även om det för närvarande inte tjänar något syfte i Android.

Följande kod definierar en funktion som heter calculateArea, som kan nås från en Java-klass kallad Huvudaktivitet:

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

Observera att förutom radien accepterar funktionen även a JNIEnv typ, som har verktygsfunktioner som du kan använda för att hantera Java-typer, och a jobject exempel, som är en hänvisning till en instans av Huvudaktivitet. Vi kommer givetvis att skapa Huvudaktivitet senare i denna handledning.

Beräkning av området är enkelt. Allt du behöver göra är att multiplicera M_PI makro vid torget av radie.

jdouble area = M_PI * radien * radien;

Bara så du vet hur du hanterar strängar när du arbetar med JNI, låt oss nu skapa en ny sträng som innehåller ett meddelande som säger vad området är. För att göra det kan du använda sprintf () fungera.

char output [40]; sprintf (output, "Området är% f kvm", område);

Eftersom Java inte direkt kan hantera en C ++ teckenuppsättning, är vår funktions returtyp jstring. Att konvertera produktion array in a jstring objekt, du måste använda NewStringUTF () fungera.

returnera jenv-> NewStringUTF (output);

Vid denna tidpunkt är vår C ++-kod klar.

4. Använda det inbyggda biblioteket

I föregående steg såg du att calculateArea () funktionen måste tillhöra Huvudaktivitet Java klass. Börja skapa klassen genom att högerklicka på ditt Java-paketnamn och välj Arkiv> Ny> Tom aktivitet.

I den dialog som dyker upp, namnge aktiviteten Huvudaktivitet. Efter att ha kontrollerat att Startaraktivitet alternativet är markerat, tryck på Avsluta knapp.

Det inbyggda biblioteket måste laddas innan det kan användas. Lägg därför till en statisk blockera till klassen och ladda biblioteket med hjälp av Loadlibrary () metod för Systemet klass.

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

För att kunna använda calculateArea () C ++-funktionen i aktiviteten måste du deklarera den som en inföding metod.

privata inbyggda String CalculateArea (dubbelradie);

Du kan nu använda calculateArea () metod som vilken vanlig Java-metod som helst. Till exempel kan du lägga till följande kod till onCreate () Metod för att beräkna och skriva ut cirkelområdet vars radie är 5,5:

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

Om du kör appen ska du kunna se följande utmatning i logcat fönster:

Slutsats

I denna handledning lärde du dig hur du skapar ett inbyggt C ++-bibliotek och använder det i en Android-applikation. Det är värt att notera att den inbyggda byggprocessen, som standard, genererar en separat .så fil för varje enskild CPU-arkitektur som NDK stöder. Därför kan du vara säker på att din ansökan kommer att köras på de flesta Android-enheter utan några problem.

För att lära mig mer om Android NDK, föreslår jag att du hänvisar till NDK Guide.

Och kolla in några av våra andra handledning och kurser om Android-utveckling!

  • Bakgrundsljud i Android Med MediaSessionCompat

    En av de mest populära användningarna för mobila enheter spelar upp ljud genom musikströmmingstjänster, nedladdade podcaster eller något annat antal ljud ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Ta bilder med din Android App

    Google Play-butiken har dussintals kameraprogram, var och en möjliggör ett annat sätt att ta foton eller göra något unikt med bilderna från ...
    Ashraff Hathibelagal
    Android SDK