Con questo breve tutorial, cercherò di illustrare in modo semplice come scrivere e richiamare funzioni scritte in codice C all’interno del nostro progetto Android.

Requisiti necessari: Android Studio, Android NDK, una conoscenza base del linguaggio C e dei comandi Unix.

Creazione del Progetto Android

Apriamo Android Studio e creiamo un nuovo progetto dal nome Math (poiché la libreria che andremo a scrivere in C conterrà funzioni matematiche), specifichiamo un Company name  (nel caso specifico com.appnjoy), selezioniamo Empty Activity e proseguiamo sino al termine del wizard di creazione del progetto.

 

Creazione cartella jni

Sulla parte sinistra di Android Studio selezioniamo la vista Project (che ci permette di visualizzare l’albero gerarchico dei file che compongono il nostro progetto) e posizionandoci sulla cartella src, creiamo al suo interno la cartella jni che conterrà i nostri sorgenti C ed il make file.

All’interno della cartella jni, creiamo il file Math.c

func

Per prima cosa, includiamo il file jni.h necessario per la definizione dei tipi. Il nome della funzione va scelto in base al seguente pattern:

Java_<package-name>_<activity-name>_<function-name>

nel nostro caso, volendo scrivere la funzione somma, questa risulterà:  Java_com_appnjoy_math_MainActivity_somma

All’interno della cartella jni, creiamo il file Android.mk che conterrà le istruzioni necessarie per la compilazione della libreria.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := mathc
LOCAL_SRC_FILES := Math.c
include $(BUILD_SHARED_LIBRARY)

 

Build della Libreria

Dal Terminal di Android, attraverso i comandi della shell posizioniamoci all’interno della cartella jni, e da qui digitiamo ndk-build.

Se il comando non viene riconosciuto, probabilmente il percorso che punta all’ installazione dell’NDK non è presente nel PATH di sistema che necessita quindi di essere opportunamente aggiunto.

In alternativa si può sempre specificare il percorso assoluto del comando, nel mio caso:

$ /home/carmelo/Android/Sdk/ndk-bundle/ndk-build

Se la build è andata a buon fine, otterremo una schermata simile alla seguente:

compileok

Il comando ndk-build creerà sotto la cartella app/src la cartella libs all’interno del quale troveremo la nostra libreria libmathc.so.

Effettuiamo adesso un refactor della cartella libs in jniLibs e andiamola a spostare sotto la cartella main.

La cartella jniLibs è la cartella dove la funzione System.loadLibrary(..) si aspetta di trovare le librerie native.

 

Uso della libreria nativa C dal Java

All’interno della classe MainActivity, dichiariamo il prototipo della funzione statica somma, carichiamo la libreria attraverso la funzione System.loadLibrary(“mathc”) ed infine utilizziamo la funzione somma con due valori numerici da noi scelti (in questo caso 120 e 50).

code

Effettuando un build dell’APK, se tutto ha funzionato correttamente, eseguendo l’applicazione, il Logcat ci stamperà il risultato della somma dei due numeri ottenuta tramite codice nativo della nostra libreria.

final