Erste Schritte mit dem Native Development Kit von Android

Mit dem Start von Android Studio 2.2 ist die Entwicklung von Android-Anwendungen, die C ++ - Code enthalten, einfacher als je zuvor. In diesem Tutorial zeige ich Ihnen, wie Sie mit dem Android Native Development Kit, das normalerweise nur als NDK bezeichnet wird, eine native C ++ - Bibliothek erstellen, deren Funktionen Java-Klassen zur Verfügung stehen.

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigen Sie Folgendes:

  • die neueste Version von Android Studio
  • ein grundlegendes Verständnis der C ++ - Syntax

1. Warum schreibe ich nativen Code??

Als Faustregel gilt, dass Sie eine Android-Anwendung nur mit Java entwickeln. Das Hinzufügen von C ++ - Code erhöht die Komplexität erheblich und verringert auch die Portabilität. Dennoch gibt es einige Gründe, warum Sie es trotzdem tun möchten:

  • Leistung maximieren: Sie können die Leistung einer Android-Anwendung verbessern, wenn auch nur geringfügig, indem Sie die CPU-intensiven Teile ihrer Geschäftslogik in C implementieren++.
  • So verwenden Sie Hochleistungs-APIs: Implementierungen von API-Spezifikationen wie Vulkan Graphics und OpenSL ES sind Bestandteil des NDK. Daher neigen Android-Spieleentwickler dazu, das NDK zu verwenden.
  • Um beliebte C / C ++ - Bibliotheken zu verwenden: Es gibt zahlreiche C- und C ++ - Bibliotheken, die keine Java-Entsprechungen haben. Wenn Sie in Ihrer Android-App mit ihnen arbeiten möchten, ist die Verwendung des NDK der richtige Weg.
  • Code wiederverwendenHinweis: In C ++ geschriebener Code kann, sofern er keine plattformspezifischen Abhängigkeiten enthält, sowohl in Android- als auch in iOS-Anwendungen verwendet werden, und zwar in der Regel mit minimalen Änderungen. Wenn Sie eine große Anwendung entwickeln und sowohl die iOS- als auch die Android-Plattform unterstützen möchten, kann die Verwendung von C ++ Ihre Produktivität verbessern.

2. Neues Projekt anlegen

In Android Studio 2.2 oder höher können Sie mit dem Assistenten zur Projekterstellung schnell neue Projekte erstellen, die C ++ - Code unterstützen.

Starten Sie, indem Sie Android Studio starten und die Taste drücken Starten Sie ein neues Android Studio-Projekt Schaltfläche im Begrüßungsbildschirm. Geben Sie im nächsten Bildschirm Ihrer Anwendung einen aussagekräftigen Namen und überprüfen Sie die Include C ++ - Unterstützung Feld.

Wählen Sie im Aktivitätsbildschirm des Assistenten die Option Keine Aktivität hinzufügen Möglichkeit. Vergewissern Sie sich im letzten Bildschirm des Assistenten, dass der Wert von C ++ - Standard Feld ist auf gesetzt Toolchain-Standard und drücken Sie die Fertig Taste.

Das Android NDK und die Tools, von denen es abhängig ist, werden standardmäßig nicht installiert. Nachdem das Projekt erstellt wurde, wird daher ein Fehler angezeigt, der wie folgt aussieht:

Um den Fehler zu beheben, gehen Sie zu Extras> Android> SDK-Manager und wechseln Sie zum SDK-Tools Tab.

Wählen Sie in der Liste der verfügbaren Entwicklertools beide aus CMake und NDK, und drücken Sie die Sich bewerben Taste.

Starten Sie Android Studio nach Abschluss der Installation neu.

3. Erstellen einer systemeigenen Bibliothek

Ein Android Studio-Projekt, das C ++ unterstützt, verfügt über ein zusätzliches Quellcode-Verzeichnis cpp. Wie Sie vielleicht schon vermutet haben, müssen alle C ++ - Dateien und -Bibliotheken darin platziert werden. Standardmäßig hat das Verzeichnis eine Datei namens native-lib.cpp. Im Moment schreiben wir unseren gesamten C ++ - Code darin.

In diesem Lernprogramm erstellen wir eine einfache native Bibliothek mit einer Funktion, die die Fläche eines Kreises anhand der Formel berechnet πr². Die Funktion akzeptiert den Radius des Kreises als Doppelte und geben Sie den Bereich als ein jstring.

Beginnen Sie mit dem Hinzufügen der folgenden umfassen Anweisungen zur Datei:

#umfassen  #umfassen  #umfassen 

jni.h ist eine Header-Datei, die mehrere Makrodefinitionen, Typen, Strukturen und Funktionen enthält, die für die Arbeit mit NDK unverzichtbar sind. (JNI steht für Java Native Interface, und dies ist das Framework, mit dem die Java Runtime mit nativem Code kommunizieren kann.) Schnur Headerdatei ist notwendig, da wir die jstring Geben Sie in unsere Bibliothek ein. Das math.h Die Header-Datei enthält den Wert von π.

Um Polymorphismus zu unterstützen, ändert der C ++ - Compiler standardmäßig die Namen aller Funktionen, die Sie in Ihrem Code definieren. Diese Funktion wird häufig als Namensverstümmelung bezeichnet. Aufgrund des Namensmanglings führt das Aufrufen Ihrer C ++ - Funktionen aus Java-Code zu Fehlern. Um Fehler zu vermeiden, können Sie die Namensveränderung deaktivieren, indem Sie Ihre Funktionen innerhalb von definieren extern "C" Block.

extern "C" // Ihre Funktionen müssen definiert werden // hier

Die Namen von C ++ - Funktionen, auf die über JNI zugegriffen werden kann, müssen das folgende Format haben:

  • Sie müssen eine haben Java_ Präfix.
  • Sie müssen ein falsches Formular des Paketnamens enthalten, in dem die Punkte durch Unterstriche ersetzt werden.
  • Sie müssen den Namen der Java-Klasse enthalten, zu der sie gehören.

Darüber hinaus müssen Sie die Sichtbarkeit der Funktion angeben. Sie können dies mit der JNIEXPORT Makro. Die meisten Entwickler schließen auch die JNICALL Makro in der Funktionsdefinition, obwohl es derzeit in Android keinen Zweck erfüllt.

Der folgende Code definiert eine aufgerufene Funktion berechnenArea, auf die von einer Java-Klasse aus zugegriffen werden kann Hauptaktivität:

JNIEXPORT jstring JNICALL Java_com_tutsplus_mynativeapplication_MainActivity_calculateArea (JNIEnv * jenv, Jobobjekt selbst, jDoppelradius) 

Beachten Sie, dass die Funktion zusätzlich zum Radius auch a akzeptiert JNIEnv type, die Dienstprogrammfunktionen enthält, mit denen Sie Java-Typen behandeln können, und a Jobobjekt Instanz, die einen Verweis auf eine Instanz von Hauptaktivität. Wir werden natürlich schaffen Hauptaktivität später in diesem Tutorial.

Die Berechnung der Fläche ist einfach. Sie müssen nur das multiplizieren M_PI Makro durch das Quadrat der Radius.

Doppelbereich = M_PI * Radius * Radius;

Damit Sie wissen, wie Sie mit Strings umgehen, während Sie mit JNI arbeiten, erstellen Sie jetzt einen neuen String, der eine Nachricht enthält, die den Bereich angibt. Dazu können Sie die sprintf () Funktion.

Zeichenausgabe [40]; sprintf (Ausgabe, "Die Fläche ist% f qm", Fläche);

Da Java ein C ++ - Zeichenarray nicht direkt verarbeiten kann, lautet der Rückgabetyp unserer Funktion jstring. Um das zu konvertieren Ausgabe Array in eine jstring Objekt müssen Sie das verwenden NewStringUTF () Funktion.

return jenv-> NewStringUTF (Ausgabe);

An diesem Punkt ist unser C ++ - Code fertig.

4. Verwendung der systemeigenen Bibliothek

Im vorherigen Schritt haben Sie gesehen, dass die berechneFläche () Funktion muss zum gehören Hauptaktivität Java-Klasse Beginnen Sie mit dem Erstellen der Klasse, indem Sie mit der rechten Maustaste auf den Namen Ihres Java-Pakets klicken und auswählen Datei> Neu> Aktivität leeren.

Benennen Sie in dem daraufhin angezeigten Dialogfeld die Aktivität Hauptaktivität. Nachdem Sie sichergestellt haben, dass die Launcher-Aktivität Option ist markiert, drücken Sie die Fertig Taste.

Die native Bibliothek muss geladen werden, bevor sie verwendet werden kann. Fügen Sie daher a statisch Blockieren Sie die Klasse und laden Sie die Bibliothek mit der loadLibrary () Methode der System Klasse.

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

Um das benutzen zu können berechneFläche () C ++ - Funktion in der Aktivität, müssen Sie sie als deklarieren gebürtig Methode.

privater nativer String calcArea (doppelter Radius);

Sie können jetzt die berechneFläche () Methode wie jede gewöhnliche Java-Methode. Beispielsweise können Sie den folgenden Code hinzufügen onCreate () Methode zum Berechnen und Drucken der Kreisfläche, deren Radius 5,5 ist:

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

Wenn Sie die App ausführen, sollten Sie die folgende Ausgabe in sehen können Logcat Fenster:

Fazit

In diesem Lernprogramm haben Sie erfahren, wie Sie eine native C ++ - Bibliothek erstellen und in einer Android-Anwendung verwenden. Es ist erwähnenswert, dass der native Erstellungsprozess standardmäßig einen separaten generiert .so Datei für jede einzelne CPU-Architektur, die der NDK unterstützt. Daher können Sie sicher sein, dass Ihre Anwendung auf den meisten Android-Geräten ohne Probleme ausgeführt werden kann.

Um mehr über das Android NDK zu erfahren, schlage ich vor, dass Sie sich auf das NDK-Handbuch beziehen.

Schauen Sie sich auch unsere anderen Tutorials und Kurse zur Android-Entwicklung an!

  • Hintergrund-Audio in Android mit MediaSessionCompat

    Eine der beliebtesten Anwendungen für mobile Geräte ist die Audiowiedergabe über Musik-Streaming-Dienste, heruntergeladene Podcasts oder eine beliebige andere Anzahl von Audiodateien.
    Paul Trebilcox-Ruiz
    Android SDK
  • Machen Sie Fotos mit Ihrer Android-App

    Im Google Play Store gibt es Dutzende von Kamera-Apps, von denen jede auf unterschiedliche Art und Weise Fotos machen oder mit den Bildern der…
    Ashraff Hathibelagal
    Android SDK