Cum să începeți cu Kitul de dezvoltare nativă Android

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.

Cerințe preliminare

Pentru a putea urmări acest tutorial, veți avea nevoie de următoarele:

  • cea mai recentă versiune de Android Studio
  • o înțelegere de bază a sintaxei C ++

1. De ce scrieți codul nativ?

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:

  • Pentru a maximiza performanța: Puteți îmbunătăți performanța unei aplicații Android, deși numai marginal, prin implementarea porțiunilor intensive ale logicii sale de afaceri în C++.
  • Pentru a utiliza API de înaltă performanță: Implementările specificațiilor API, cum ar fi Vulkan Graphics și OpenSL ES, fac parte din NDK. Prin urmare, dezvoltatorii de jocuri Android tind să utilizeze NDK.
  • Pentru a utiliza biblioteci populare C / C ++: Există numeroase biblioteci C și C ++ care nu au echivalente Java. Dacă doriți să lucrați cu ele în aplicația dvs. Android, folosiți NDK-ul este calea de urmat.
  • Pentru a reutiliza codul: Atâta timp cât nu conține dependențe specifice platformei, codul scris în C ++ poate fi folosit atât în ​​aplicații Android cât și în aplicații iOS, de obicei cu modificări minime. Dacă dezvoltați o aplicație mare și intenționați să sprijiniți atât platformele iOS și Android, utilizarea C ++ vă poate îmbunătăți productivitatea.

2. Crearea unui nou proiect

Î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.

3. Crearea unei Biblioteci native

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:

  • Trebuie să aibă a Java_ prefix.
  • Acestea trebuie să conțină o formă mugurată a numelui pachetului unde punctele sunt înlocuite cu subliniere.
  • Acestea trebuie să conțină numele clasei Java de care aparțin.

Î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.

4. Folosind Biblioteca Nativă

Î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ă:

Concluzie

Î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!

  • Audio de fundal în Android Cu MediaSessionCompat

    Una dintre cele mai populare utilizări pentru dispozitivele mobile este redarea audio prin servicii de streaming muzical, podcast-uri descărcate sau orice alt număr de audio ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Faceți fotografii cu aplicația dvs. Android

    Magazinul Google Play are zeci de aplicații pentru camere - fiecare dintre ele permițând un alt mod de a face fotografii sau de a face ceva unic cu imaginile din ...
    Ashraff Hathibelagal
    Android SDK
Cod