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.
Per poter seguire questo tutorial, avrai bisogno di quanto segue:
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:
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.
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:
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.
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:
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!