Odată cu lansarea aplicației Android Studio 2.2, dezvoltarea aplicațiilor Android care conțin codul C ++ a devenit mai ușoară ca niciodată. În acest tutorial, vă vom arăta cum să utilizați Android Native Development Kit, care este de obicei denumit doar NDK, pentru a crea o bibliotecă nativă C ++ ale cărei funcții sunt disponibile pentru clasele Java.
Pentru a putea urmări acest tutorial, veți avea nevoie de următoarele:
Ca regulă generală, veți dezvolta o aplicație Android utilizând numai Java. Adăugarea codului C ++ sporește dramatic complexitatea sa și, de asemenea, reduce portabilitatea acestuia. Cu toate acestea, iată câteva motive pentru care totuși doriți să faceți acest lucru:
În aplicația Android Studio 2.2 sau o versiune superioară, expertul de creare a proiectului vă permite să creați rapid proiecte noi care suportă codul C ++.
Începeți prin lansarea Android Studio și apăsând Porniți un nou proiect Android Studio pe ecranul de întâmpinare. În ecranul următor, dați aplicației dvs. un nume semnificativ și verificați Includeți suport C ++ camp.
În ecranul de creare a activității din expert, alegeți Adăugați nicio activitate opțiune. În ecranul final al expertului, asigurați-vă că valoarea lui Standard C ++ câmpul este setat la Toolchain Implicit și apăsați tasta finalizarea buton.
NDK-ul Android și instrumentele pe care le depinde nu sunt instalate în mod implicit. Prin urmare, odată ce proiectul a fost generat, veți vedea o eroare care arată astfel:
Pentru a remedia eroarea, mergeți la Instrumente> Android> Manager SDK și comutați la Instrumentele SDK fila.
În lista instrumentelor de dezvoltare disponibile, selectați ambele CMake și NDK, și apăsați tasta aplica buton.
După finalizarea instalării, reporniți Android Studio.
Un proiect Android Studio care suportă C ++ are un director de cod sursă suplimentar numit cpp. După cum probabil ați ghicit, toate fișierele și bibliotecile C ++ trebuie plasate în interiorul acesteia. În mod implicit, directorul are un fișier numit nativ-lib.cpp. Pentru moment, vom scrie tot codul nostru C ++ în interiorul lui.
În acest tutorial, vom crea o bibliotecă simplă nativă care conține o funcție care calculează zona unui cerc folosind formula πr². Funcția va accepta raza cercului ca a jdouble
și întoarceți zona ca a jstring
.
Începeți prin adăugarea următoarelor include
directivele la dosar:
#include#include #include
jni.h este un fișier antet care conține mai multe definiții macro, tipuri, structuri și funcții, toate fiind indispensabile în timpul colaborării cu NDK. (JNI înseamnă Java Native Interface și acesta este cadrul care permite Java Runtime să comunice cu codul nativ.) şir fișierul antet este necesar pentru că vom folosi jstring
tip în biblioteca noastră. math.h fișierul header conține valoarea lui π.
În mod implicit, pentru a sprijini polimorfismul, compilatorul C ++ modifică numele tuturor funcțiilor pe care le definiți în codul dvs. Această caracteristică este adesea menționată ca denumirea de mangling. Datorită denigrării numelui, apelarea funcțiilor dvs. C ++ din codul Java va duce la erori. Pentru a evita erorile, puteți dezactiva numele de mangling definindu-vă funcțiile în interiorul unui extern "C"
bloc.
extern "C" // Funcțiile dvs. trebuie definite aici // aici
Numele funcțiilor C ++ accesibile prin JNI trebuie să aibă următorul format:
În plus, trebuie să specificați vizibilitatea funcției. Puteți face acest lucru folosind JNIEXPORT
macro. Prin convenție, majoritatea dezvoltatorilor includ de asemenea JNICALL
macro în definirea funcției, deși nu funcționează în prezent în Android.
Următorul cod definește o funcție numită calculateArea
, care pot fi accesate dintr-o clasă Java numită Activitate principala
:
JNIEXPORT jstring JNICALL Java_com_tutsplus_mynativeapplication_MainActivity_calculateArea (JNIEnv * jenv, job self, raza jdouble)
Rețineți că, pe lângă rază, funcția acceptă și a JNIEnv
tip, care are funcții de utilitate pe care le puteți utiliza pentru a manipula tipurile Java și a jobject
exemplu, care este o referință la un exemplu de Activitate principala
. Vom crea, bineînțeles Activitate principala
mai târziu în acest tutorial.
Calculul zonei este ușor. Tot ce trebuie să faceți este să multiplicați M_PI
macro de la pătratul rază
.
jdouble area = M_PI * raza * raza;
Doar ca sa stii cum sa se ocupe de siruri de caractere in timp ce lucrezi cu JNI, sa creem acum un nou sir continand un mesaj care sa spuna ce este zona. Pentru a face acest lucru, puteți utiliza funcția sprintf ()
funcţie.
ieșire char [40]; sprintf (ieșire, "Zona este% f mpm", zonă);
Deoarece Java nu poate gestiona direct o matrice de caractere C ++, tipul de returnare al funcției este jstring
. Pentru a converti producție
array într-un jstring
obiect, trebuie să utilizați NewStringUTF ()
funcţie.
returnează jenv-> NewStringUTF (ieșire);
În acest moment, codul nostru C ++ este gata.
În pasul anterior, ați văzut că calculateArea ()
funcția trebuie să aparțină Activitate principala
Clasa Java. Începeți să creați clasa făcând clic dreapta pe numele pachetului dvs. Java și selectând Fișier> Nou> Activitate gol.
În dialogul care apare, denumiți activitatea Activitate principala. După ce vă asigurați că Activitatea de lansare opțiunea este bifată, apăsați pe finalizarea buton.
Biblioteca nativă trebuie încărcată înainte de a fi utilizată. Prin urmare, adăugați a static
blocați la clasă și încărcați biblioteca folosind LoadLibrary ()
metodă a Sistem
clasă.
static System.loadLibrary ("nativ-lib");
Pentru a putea folosi calculateArea ()
Funcția C ++ în interiorul activității, trebuie să o declarați ca a nativ
metodă.
privat String calculează Area (raza dublă);
Acum puteți folosi calculateArea ()
ca orice metodă obișnuită Java. De exemplu, puteți adăuga următorul cod la onCreate ()
metoda de calculare și tipărire a zonei cercului a cărei rază este de 5,5:
Log.d (TAG, calculațiArea (5.5f));
Dacă rulați aplicația, ar trebui să puteți vedea următoarea ieșire în logcat fereastră:
În acest tutorial, ați învățat cum să creați o bibliotecă nativă C ++ și să o utilizați într-o aplicație Android. Este de remarcat faptul că procesul de construire nativ, implicit, generează un proces separat .asa de fișier pentru fiecare arhitectură CPU unică acceptată de NDK. Prin urmare, puteți fi sigur că aplicația dvs. se va difuza pe majoritatea dispozitivelor Android fără probleme.
Pentru a afla mai multe despre NDK Android, vă sugerăm să consultați Ghidul NDK.
Și verificați câteva din celelalte tutoriale și cursuri ale noastre despre dezvoltarea Android!