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.
Um diesem Tutorial folgen zu können, benötigen Sie Folgendes:
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:
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.
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:
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.
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:
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!