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ör att kunna följa denna handledning behöver du följande:
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:
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.
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:
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.
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:
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!