Aan de slag met de Native Development Kit van Android

Met de lancering van Android Studio 2.2 is het ontwikkelen van Android-applicaties die C ++-code bevatten, eenvoudiger dan ooit. In deze zelfstudie laat ik je zien hoe je de Android Native Development Kit, die meestal alleen NDK wordt genoemd, gebruikt om een ​​native C ++ -bibliotheek te maken waarvan de functies beschikbaar zijn voor Java-klassen..

voorwaarden

Om deze tutorial te kunnen volgen, hebt u het volgende nodig:

  • de nieuwste versie van Android Studio
  • een basiskennis van de C ++ syntaxis

1. Waarom inheemse code schrijven?

Als vuistregel zou je een Android-applicatie ontwikkelen met alleen Java. Het toevoegen van C ++ -code verhoogt de complexiteit ervan dramatisch en vermindert ook de draagbaarheid. Niettemin, hier zijn enkele redenen waarom je het nog steeds zou willen doen:

  • Om de prestaties te maximaliseren: U kunt de prestaties van een Android-applicatie verbeteren, maar slechts marginaal, door de CPU-intensieve delen van de bedrijfslogica in C te implementeren++.
  • Om krachtige API's te gebruiken: Implementaties van API-specificaties zoals Vulkan Graphics en OpenSL ES maken deel uit van de NDK. Daarom gebruiken Android-spelontwikkelaars de NDK.
  • Gebruik van populaire C / C ++ -bibliotheken: Er zijn talloze C- en C ++ -bibliotheken die geen Java-equivalenten hebben. Als u met hen wilt werken in uw Android-app, is het gebruik van de NDK de juiste keuze.
  • Code opnieuw gebruiken: Zolang het geen platformspecifieke afhankelijkheden bevat, kan code geschreven in C ++ worden gebruikt in zowel Android- als iOS-applicaties, meestal met minimale wijzigingen. Als u een grote applicatie aan het ontwikkelen bent en zowel de iOS- als Android-platforms wilt ondersteunen, kan het gebruik van C ++ uw productiviteit verbeteren.

2. Een nieuw project maken

In Android Studio 2.2 of hoger kunt u met de wizard voor projectcreatie snel nieuwe projecten maken die C ++ -code ondersteunen.

Begin door Android Studio te starten en op te drukken Start een nieuw Android Studio-project knop in het welkomstscherm. Geef in het volgende scherm uw applicatie een betekenisvolle naam en controleer de Inclusief C ++ -ondersteuning veld-.

Kies de. In het venster voor het maken van activiteiten van de wizard Voeg geen activiteit toe keuze. Controleer in het laatste scherm van de wizard of de waarde van de C ++ standaard veld is ingesteld op Toolchain standaard en druk op de Af hebben knop.

De Android NDK en de tools waarvan het afhankelijk is, worden niet standaard geïnstalleerd. Daarom ziet u na het genereren van het project een fout die er als volgt uitziet:

Ga naar om de fout te verhelpen Hulpmiddelen> Android> SDK Manager en schakel over naar SDK Tools tab.

Selecteer beide in de lijst met beschikbare ontwikkelaarstools CMake en NDK, en druk op de Van toepassing zijn knop.

Zodra de installatie is voltooid, start u Android Studio opnieuw op.

3. Een inheemse bibliotheek maken

Een Android Studio-project dat C ++ ondersteunt, heeft een extra broncode-map genaamd cpp. Zoals je misschien al geraden hebt, moeten alle C ++ -bestanden en -bibliotheken erin worden geplaatst. Standaard heeft de map een bestand met de naam native-lib.cpp. Voorlopig schrijven we al onze C ++-code erin.

In deze zelfstudie maken we een eenvoudige native-bibliotheek met een functie die het gebied van een cirkel berekent met behulp van de formule πr². De functie accepteert de straal van de cirkel als een jdouble en breng het gebied terug als een JString.

Begin met het toevoegen van het volgende omvatten richtlijnen voor het bestand:

#include  #include  #include 

jni.h is een headerbestand met verschillende macrodefinities, -typen, -structuren en -functies, die allemaal onmisbaar zijn tijdens het werken met NDK. (JNI staat voor Java Native Interface en dit is het raamwerk waarmee de Java Runtime kan communiceren met native code.) draad header-bestand is noodzakelijk omdat we de JString typ in onze bibliotheek. De math.h header-bestand bevat de waarde van π.

Standaard wijzigt de C ++ -compiler, ter ondersteuning van polymorfisme, de namen van alle functies die u in uw code definieert. Deze functie wordt vaak mangling genoemd. Vanwege mangling, leidt het aanroepen van je C ++ -functies uit Java-code tot fouten. Om fouten te voorkomen, kunt u het mappen van namen uitschakelen door uw functies binnen een externe "C" blok.

extern "C" // Uw functies moeten hier worden gedefinieerd // hier

De namen van C ++ -functies die toegankelijk zijn via JNI moeten de volgende indeling hebben:

  • Ze moeten een hebben Java_ voorvoegsel.
  • Ze moeten een verminkte vorm van de pakketnaam bevatten waarbij de punten worden vervangen door onderstrepingstekens.
  • Ze moeten de naam bevatten van de Java-klasse waartoe ze behoren.

Bovendien moet u de zichtbaarheid van de functie opgeven. U kunt dit doen met behulp van de JNIEXPORT macro. Volgens afspraak bevatten de meeste ontwikkelaars ook de JNICALL macro in de functiedefinitie, hoewel het momenteel geen enkel doel dient in Android.

De volgende code definieert een functie genaamd calculateArea, die toegankelijk is vanuit een Java-klasse met de naam Hoofdactiviteit:

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

Merk op dat naast de straal ook de functie a accepteert JNIEnv type, met hulpprogramma's die u kunt gebruiken om Java-typen af ​​te handelen, en een jobject Dit is bijvoorbeeld een verwijzing naar een exemplaar van Hoofdactiviteit. We zullen natuurlijk creëren Hoofdactiviteit later in deze tutorial.

Het berekenen van het gebied is eenvoudig. Het enige dat u hoeft te doen is het aantal vermenigvuldigen M_PI macro door het vierkant van de radius.

jdouble area = M_PI * radius * radius;

Zodat u weet hoe u moet omgaan met strings tijdens het werken met JNI, laten we nu een nieuwe reeks maken met een bericht waarin staat wat het gebied is. Om dit te doen, kunt u de sprintf () functie.

char output [40]; sprintf (output, "Het gebied is% f m²", oppervlakte);

Omdat Java niet rechtstreeks een C ++ -tekenreeks kan verwerken, is het retourtype van onze functie JString. Om de uitgang array in een JString object, moet u de NewStringUTF () functie.

return jenv-> NewStringUTF (output);

Op dit moment is onze C ++-code gereed.

4. De inheemse bibliotheek gebruiken

In de vorige stap zag je dat het calculateArea () functie moet behoren tot de Hoofdactiviteit Java-klasse. Begin met het maken van de les door met de rechtermuisknop op de naam van uw Java-pakket te klikken en te selecteren Bestand> Nieuw> Lege activiteit.

Typ de activiteit in het dialoogvenster dat wordt weergegeven Hoofdactiviteit. Na ervoor te zorgen dat de Launcher Activity optie is aangevinkt, druk op de Af hebben knop.

De native library moet worden geladen voordat deze kan worden gebruikt. Voeg daarom een ​​toe statisch blok naar de klasse en laad de bibliotheek met behulp van de LoadLibrary () methode van de Systeem klasse.

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

Om de. Te kunnen gebruiken calculateArea () C ++ functie binnen de activiteit, moet je het als een declareren inheems methode.

private native String calculationArea (dubbele straal);

U kunt nu de calculateArea () methode zoals elke gewone Java-methode. U kunt bijvoorbeeld de volgende code toevoegen aan de onCreate () methode om het cirkelgebied met een straal van 5,5 te berekenen en af ​​te drukken:

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

Als u de app uitvoert, zou u de volgende uitvoer moeten kunnen zien in de logcat venster:

Conclusie

In deze zelfstudie leer je hoe je een native C ++ -bibliotheek kunt maken en deze in een Android-toepassing kunt gebruiken. Het is vermeldenswaard dat het native build-proces standaard een afzonderlijke genereert .zo bestand voor elke CPU-architectuur die de NDK ondersteunt. Daarom kunt u er zeker van zijn dat uw toepassing probleemloos op de meeste Android-apparaten wordt uitgevoerd.

Voor meer informatie over de Android NDK, raad ik u aan de NDK-gids te raadplegen.

En bekijk enkele van onze andere tutorials en cursussen over Android-ontwikkeling!

  • Achtergrondaudio in Android met MediaSessionCompat

    Een van de populairste toepassingen voor mobiele apparaten is het afspelen van audio via services voor muziekstreaming, gedownloade podcasts of een ander aantal audio ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Neem foto's met uw Android-app

    De Google Play Store heeft tientallen camera-apps, elk met een andere manier om foto's te maken of iets unieks te doen met de foto's van de ...
    Ashraff Hathibelagal
    Android SDK