Come iniziare con il kit di sviluppo nativo di Android

Con il lancio di Android Studio 2.2, lo sviluppo di applicazioni Android che contengono codice C ++ è diventato più facile che mai. In questo tutorial, ti mostrerò come utilizzare Android Native Development Kit, che di solito viene chiamato solo NDK, per creare una libreria C ++ nativa le cui funzioni sono disponibili per le classi Java.

Prerequisiti

Per poter seguire questo tutorial, avrai bisogno di quanto segue:

  • l'ultima versione di Android Studio
  • una conoscenza di base della sintassi C ++

1. Perché scrivere il codice nativo?

Come regola generale, svilupperesti un'applicazione Android utilizzando solo Java. L'aggiunta del codice C ++ aumenta la sua complessità in modo drammatico e riduce anche la sua portabilità. Tuttavia, ecco alcuni motivi per cui vorresti ancora farlo:

  • Per massimizzare le prestazioni: È possibile migliorare le prestazioni di un'applicazione Android, anche se solo marginalmente, implementando le porzioni di CPU della sua logica aziendale in C++.
  • Per utilizzare le API ad alte prestazioni: Implementazioni di specifiche API come Vulkan Graphics e OpenSL ES fanno parte di NDK. Pertanto, gli sviluppatori di giochi Android tendono a utilizzare NDK.
  • Per utilizzare le librerie C / C ++ più diffuse: Esistono numerose librerie C e C ++ che non hanno equivalenti Java. Se vuoi lavorare con loro nella tua app per Android, usare NDK è la strada da percorrere.
  • Per riutilizzare il codice: Finché non contiene alcuna dipendenza specifica della piattaforma, il codice scritto in C ++ può essere utilizzato in entrambe le applicazioni Android e iOS, di solito con modifiche minime. Se stai sviluppando un'applicazione di grandi dimensioni e intendi supportare entrambe le piattaforme iOS e Android, l'utilizzo di C ++ potrebbe migliorare la tua produttività.

2. Creazione di un nuovo progetto

In Android Studio 2.2 o versioni successive, la procedura guidata per la creazione del progetto ti consente di creare rapidamente nuovi progetti che supportano il codice C ++.

Inizia lanciando Android Studio e premendo il tasto Avvia un nuovo progetto Android Studio pulsante nella schermata di benvenuto. Nella schermata successiva, dai un nome significativo alla tua applicazione e controlla il Includi supporto C ++ campo.

Nella schermata di creazione dell'attività della procedura guidata, scegliere il Aggiungi Nessuna Attività opzione. Nella schermata finale della procedura guidata, assicurarsi che il valore di Standard C ++ il campo è impostato su Default Toolchain e premere il finire pulsante.

L'NDK di Android e gli strumenti da cui dipende non sono installati per impostazione predefinita. Pertanto, una volta generato il progetto, verrà visualizzato un errore simile al seguente:

Per correggere l'errore, vai a Strumenti> Android> Manager SDK e passare al Strumenti SDK linguetta.

Nell'elenco degli strumenti disponibili per gli sviluppatori, seleziona entrambi CMake e NDK, e premere il Applicare pulsante.

Una volta completata l'installazione, riavvia Android Studio.

3. Creazione di una libreria nativa

Un progetto Android Studio che supporta C ++ ha una directory di codice sorgente aggiuntiva chiamata cpp. Come avrai intuito, tutti i file e le librerie C ++ devono essere collocati al suo interno. Per impostazione predefinita, la directory ha un file chiamato native-lib.cpp. Per ora, scriveremo tutto il codice C ++ al suo interno.

In questo tutorial, creeremo una semplice libreria nativa contenente una funzione che calcola l'area di un cerchio utilizzando la formula πr². La funzione accetterà il raggio del cerchio come a jdouble e restituire l'area come a jstring.

Inizia aggiungendo quanto segue includere direttive al file:

#includere  #includere  #includere 

jni.h è un file di intestazione contenente diverse definizioni di macro, tipi, strutture e funzioni, tutte indispensabili durante il lavoro con NDK. (JNI sta per Java Native Interface e questa è la struttura che consente a Java Runtime di comunicare con il codice nativo) stringa il file di intestazione è necessario perché useremo il jstring scrivi nella nostra libreria. Il math.h il file di intestazione contiene il valore di π.

Per impostazione predefinita, per supportare il polimorfismo, il compilatore C ++ modifica i nomi di tutte le funzioni definite nel codice. Questa funzionalità viene spesso definita mangling del nome. A causa del nome mangling, chiamare le tue funzioni C ++ dal codice Java porterà ad errori. Per evitare gli errori, puoi disabilitare il nome mangling definendo le tue funzioni all'interno di extern "C" bloccare.

extern "C" // Le tue funzioni devono essere definite // qui

I nomi delle funzioni C ++ accessibili tramite JNI devono avere il seguente formato:

  • Devono avere un Giava_ prefisso.
  • Devono contenere una forma storpiata del nome del pacchetto in cui i punti sono sostituiti con caratteri di sottolineatura.
  • Devono contenere il nome della classe Java a cui appartengono.

Inoltre, è necessario specificare la visibilità della funzione. Puoi farlo usando il JNIEXPORT macro. Per convenzione, la maggior parte degli sviluppatori include anche il JNICALL macro nella definizione della funzione, anche se attualmente non ha alcuno scopo in Android.

Il codice seguente definisce una funzione chiamata calculateArea, a cui si può accedere da una classe Java chiamata Attività principale:

JNIEXPORT jstring JNICALL Java_com_tutsplus_mynativeapplication_MainActivity_calculateArea (JNIEnv * jenv, jobject self, jdouble radius) 

Nota che oltre al raggio, la funzione accetta anche a MEnv tipo, che ha funzioni di utilità che è possibile utilizzare per gestire i tipi Java e a jobject istanza, che è un riferimento a un'istanza di Attività principale. Naturalmente, stiamo creando Attività principale più avanti in questo tutorial.

Calcolare l'area è facile. Tutto quello che devi fare è moltiplicare il M_PI macro dal quadrato del raggio.

jdouble area = raggio M_PI * raggio *;

Solo per sapere come gestire le stringhe mentre si lavora con JNI, creiamo ora una nuova stringa contenente un messaggio che indichi l'area. Per fare ciò, puoi usare il sprintf () funzione.

uscita char [40]; sprintf (output, "L'area è% f mq", area);

Poiché Java non può gestire direttamente un array di caratteri C ++, il tipo di ritorno della nostra funzione è jstring. Per convertire il produzione array in a jstring oggetto, è necessario utilizzare il NewStringUTF () funzione.

return jenv-> NewStringUTF (output);

A questo punto, il nostro codice C ++ è pronto.

4. Utilizzo della libreria nativa

Nel passaggio precedente, hai visto che il calculateArea () la funzione deve appartenere al Attività principale Classe Java Iniziare a creare la classe facendo clic con il pulsante destro del mouse sul nome del pacchetto Java e selezionando File> Nuovo> Attività vuota.

Nella finestra di dialogo che si apre, dai un nome all'attività Attività principale. Dopo aver verificato che il Attività di avvio l'opzione è selezionata, premere il tasto finire pulsante.

La libreria nativa deve essere caricata prima di poter essere utilizzata. Pertanto, aggiungere un statico bloccare la classe e caricare la libreria usando il LoadLibrary () metodo del Sistema classe.

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

Essere in grado di usare il calculateArea () Funzione C ++ all'interno dell'attività, devi dichiararla come a nativo metodo.

stringa nativa privata calculateArea (doppio raggio);

Ora puoi usare il calculateArea () metodo come qualsiasi normale metodo Java. Ad esempio, è possibile aggiungere il seguente codice al onCreate () metodo per calcolare e stampare l'area del cerchio il cui raggio è 5,5:

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

Se esegui l'app, dovresti essere in grado di vedere il seguente output in logcat finestra:

Conclusione

In questo tutorial, hai imparato come creare una libreria C ++ nativa e usarla in un'applicazione Android. Vale la pena notare che il processo di creazione nativo, per impostazione predefinita, genera un separato .così file per ogni singola architettura CPU supportata da NDK. Pertanto, puoi essere certo che la tua applicazione verrà eseguita sulla maggior parte dei dispositivi Android senza problemi.

Per ulteriori informazioni su NDK Android, ti suggerisco di fare riferimento alla Guida NDK.

E dai un'occhiata ad altri nostri tutorial e corsi sullo sviluppo di Android!

  • Audio di sottofondo in Android con MediaSessionCompat

    Uno degli usi più popolari per i dispositivi mobili è la riproduzione audio attraverso servizi di streaming musicale, podcast scaricati o qualsiasi altro numero di audio ...
    Paul Trebilcox-Ruiz
    SDK Android
  • Scatta foto con la tua app Android

    Google Play Store offre decine di app per fotocamere, ognuna delle quali consente di scattare foto o fare qualcosa di unico con le immagini del ...
    Ashraff Hathibelagal
    SDK Android