Compilare applicazioni Android* NDK con Intel® Integrated Performance Primitives (Intel® IPP)


Intel® Integrated Performance Primitives (Intel® IPP) fornisce delle funzioni di elementi di base altamente ottimizzate per l'elaborazione delle immagini, l'elaborazione del segnale, la matematica vettoriale e il calcolo di matrici ridotte. Diversi domini di Intel IPP contengono le funzioni manualmente ottimizzate per il processore Intel® Atom™ utilizzando le istruzioni di Intel® Streaming SIMD Extensions (Intel® SSE). Le librerie Linux* statiche e non-threaded di Intel IPP ora supportano il sistema operativo Android* e possono essere utilizzate con le applicazioni Android.

Questo articolo fornisce un'introduzione su come aggiungere funzioni Intel IPP nelle applicazioni Android NDK. Intel IPP offre un'ottimizzazione specifica del processore e può essere collegato solo con codice C/C++ nativo Android. Per utilizzare Intel IPP con l'applicazione, è necessario includere nel codice sorgente le funzioni di Intel IPP ed è inoltre necessario aggiungere le librerie Intel IPP nella riga di comando di compilazione.

Uso di Intel IPP

1. Aggiunta delle funzioni di Intel IPP nella sorgente

  • Includere i file di intestazione di Intel IPP (ipp.h) nei file sorgente.
  • Chiamare ippInit() prima di utilizzare qualsiasi altra funzione Intel IPP. Intel IPP rileva le caratteristiche del processore e seleziona il percorso di ottimizzazione del codice per i processori di destinazione. Prima di chiamare altre funzioni di Intel IPP, chiamare ippInit() per inizializzare il dispatching della CPU per Intel IPP.
  • Chiamare le funzioni Intel IPP nella sorgente C/C++.

2. Inclusione delle librerie Intel IPP nei file di compilazione Android NDK

  • Copiare le librerie e le intestazioni di Intel IPP nella cartella del progetto.
  • Individuare le librerie Intel richieste per l'applicazione: le librerie Intel IPP sono suddivise in diversi domini. Ogni dominio ha una propria libreria e alcune librerie di dominio dipendono da altre. È necessario che tutte le librerie di dominio e le loro dipendenze siano incluse nella riga di collegamento. Consultare l'articolo sulle “Dipendenze della libreria Intel IPP” per informazioni sulle librerie Intel IPP necessarie.
  • Aggiungere le librerie Intel IPP al file di script di compilazione Android “jni/Android.mk”:
    Dichiarare ogni libreria Intel IPP come modulo di libreria precompilato. Ad esempio, se l'applicazione utilizza due librerie Intel IPP "libipps.a" e "libippcore.a", aggiungere al file quanto segue:
               include $(CLEAR_VARS)
               LOCAL_MODULE := ipps
               LOCAL_SRC_FILES := ../ipp/lib/ia32/libipps.a
               include $(PREBUILT_STATIC_LIBRARY)

               include $(CLEAR_VARS)
               LOCAL_MODULE := ippcore
               LOCAL_SRC_FILES := ../ipp/lib/ia32/libippcore.a
               include $(PREBUILT_STATIC_LIBRARY) 

Aggiungere il percorso dell'intestazione e le librerie Intel IPP nei moduli di chiamata delle funzioni Intel IPP:

               include $(CLEAR_VARS)
               LOCAL_MODULE := IppAdd
               LOCAL_SRC_FILES := IppAdd.c
               LOCAL_STATIC_LIBRARIES := ipps ippcore
               LOCAL_C_INCLUDES := ./ipp/include
               include $(BUILT_SHARED_LIBRARY)

Compilazione di un esempio di codice

Qui di seguito è riportato un semplice esempio che mostra l'utilizzo di Intel IPP nel codice nativo Android. Il codice utilizza la funzione Intel IPP ippsAdd_32f() per aggiungere i dati per due array.

Per rivedere l'utilizzo di Intel IPP nel codice:

  1. Scaricare il codice di esempio e scompattarlo nella cartella del progetto (<directoryprogetto>).
  2. Imparare l'utilizzo di Intel IPP nei file sorgente: il file "jni/IppAdd.c" fornisce l'implementazione di una funzione nativa NativeIppAdd (). La funzione chiama la funzione Intel IPP ippsAdd_32f(). Il file "src/com/example/testippadd/ArrayAddActivity.java" chiama la funzione nativa "NativeIppAdd()" tramite JNI.
  3. Controllare il file "jni/Android.mk". Questo file aggiunge le necessarie librerie Intel IPP allo script di compilazione. L'esempio utilizza la funzione ippsAdd_32f() che appartiene al dominio di elaborazione del segnale Intel IPP. La funzione dipende dalle librerie "libipps.a" e "libippcore.a". Il file "Android.mk" crea per loro due librerie precompilate.

È possibile creare il codice di esempio sia utilizzando gli strumenti di comando dell'SDK e dell'NDK che utilizzando Eclipse* IDE

Compilare l'esempio dalla riga di comando

         >cd <projectdir>
         ><ndkdir>/ndk-build 
         >cd <projectdir>
         >android update project -p . -s
         >ant debug
         >adb install bin/ArrayAddActivity-debug.apk 
  1. Copiare le intestazioni e librerie Intel IPP nella cartella del progetto (ad esempio <directoryprogetto>/ipp).
  2. Eseguire lo script "ndk-build" dalla directory del progetto per compilare il codice nativo
  3. Compilare il pacchetto Android e installare l'applicazione

Compilare l'esempio da Eclipse* IDE

         >cd <projectdir>
         ><ndkdir>/ndk-build 
  1. Copiare le intestazioni e le librerie Intel IPP nella cartella del progetto (ad esempio <directoryprogetto>/ipp).
  2. In Eclipse, fare clic su File (File) >> New (Nuovo) >> Project... (Progetto) >> Android (Android) >> Android Project from Existing Code (Progetto android da codice esistente). In "Root Directory" (Directory principale), selezionare la cartella del codice di esempio, quindi fare clic su Finish (Fine).
  3. Eseguire lo script 'ndk-build' dalla directory del progetto per compilare il codice nativo:
  4. Compilare l'applicazione in Eclipse IDE e distribuire il file .apk.

Riepilogo
Questo articolo fornisce un'introduzione all'uso di Intel IPP con le applicazioni native Android. Per ulteriori informazioni sulle funzioni di Intel IPP, consultare il manuale di Intel IPP.