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..
Om deze tutorial te kunnen volgen, hebt u het volgende nodig:
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:
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.
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:
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.
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:
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!