SlideShare una empresa de Scribd logo
Introducción Android NDK
                Barcelona GTUG
                     Marzo 2011


             fernando@ideaknow.com
                           @fegabe
GTUG, Habemus Logo!




     designed by Maria Orús Valls
       maria.orus@gmail.com
Introducción


         ¿Qué es?
         ¿Qué permite?
         Librerías incluidas
         ¿Cuándo usarlo?
¿Qué es?




Conjunto de herramientas para compilar
componentes nativos y poder utilizarlos
       en aplicaciones Android.
¿Qué es?



      ¡¡¿¿What??!!
¿Qué permite?

   Entre otras cosas permite
      Utilizar librerías C/C++
      Invocar código C/C++ desde Java (y al revés)


      OpenGL ES 1.0 y 2.0


   Desde NDKr5 (Gingerbread)
       Aplicación android escrita completamente en C/C++
        (activities nativas)
       Acceder input (teclado, touch screen)
       Acceder sensores (acelerómetro, brújula...)
       Reproducir audio
       Recuperar recursos incluidos en el APK (R.*)
Librerías incluidas

   JNI interface headers         libjnigraphics (Pixel buffer
                                   access) header (for
   libc (C library) headers
                                   Android 2.2 and above).
   libm (math library)           A Minimal set of headers
    headers
                                   for C++ support
   libz (Zlib compression)       OpenSL ES native audio
    headers
                                   libraries
   liblog (Android logging)      Android native application
    header
                                   APIS
   OpenGL ES 1.1 and
    OpenGL ES 2.0 (3D
    graphics libraries)
    headers
¿Cuándo usarlo?

   No recomendado para la mayoría de las aplicaciones

     No siempre aumenta el rendimiento pero siempe
               incrementa la complejidad

                 Sospechosos habituales

Operaciones de CPU intensivas, que no reserven mucha
  memoria: procesamiento de señales, simulaciones
                 físicas, juegos...
Primeros Pasos



             Requisitos
             Instalación
             Ejemplos
Requisitos

   Android SDK
      Android 1.5 SDK o superior
   Sistemas operativos soportados
      Windows XP (32-bit) o Vista (32- or 64-bit).
      Mac OS X 10.4.8 o superior (x86 only).


      Linux (32 o 64-bit).


   Herramienta de desarrollo requeridas
       GNU Make 3.81 o superior.
       Versión reciente de awk.
       Para Windows, Cygwin 1.7 o superior.
Instalación

   Descargar e instalar Android SDK
http://developer.android.com/sdk/index.html

   Descargar y descomprimir Android NDK
http://developer.android.com/sdk/ndk/index.html

   Incluir directorio NDK en el PATH
export NDK_ROOT=/home/fegabe/android-ndk-r5
export PATH=$PATH:$NDK_ROOT
Ejemplos incluidos con NDK

   La mejor manera de aprender NDK y saber qué
    se puede hacer


   hello-jni               hello-neon
   two-libs                bitmap-plasma
   san-angeles             native-activity
   hello-gl2               native-plasma
Calculadora NDK

   Código Java
   Código C
   Android.mk
   Compilar y ejecutar
Código Java. Calculator.java
Calculadora NDK

package org.gtug.bcn.fegabe.ndk.calculator;

// Cargamos la librería 'sample-calculator' durante
// el arranque de la aplicación.
static {
    System.loadLibrary("sample-calculator");
}

// Método nativo que se implementa en la librería
// nativa 'sample-calculator', se empaqueta junto a esta
// aplicación.
Private static native int operate(int value1, int value2,
String operation);

public static int performOperation(int value1, int value2,
String operation) {
    // Se invoca el método nativo como si fuera un método
    // normal
    return operate(value1, value2, operation);
}
Código C. calculator.c
    Calculadora NDK


// El nombre del método en el código nativo se
// forma concatenando el package donde está definido
// (org.gtug.bcn.fegabe.ndk.calculator), el nombre de la
// clase (Calculator) y el nombre del método (operate)
jint Java_org_gtug_bcn_fegabe_ndk_calculator_Calculator_operate
(JNIEnv *env,jclass clazz, jint value1, jint value2, jstring
operation) {

     int result = 0;
     const char* strOperation;
     strOperation = (*env)->GetStringUTFChars(env, operation, 0);

     if (strcmp(strOperation, "+") == 0)
        result = value1 + value2;

     LOGI("Calculator_operate: %d %s %d = %d", value1,
        strOperation, value2, result);
     return result;
}
Android.mk 1/2
Calculadora NDK



    Se trata de un Makefile que describe
     al compilador de NDK los ficheros
     C/C++.
    Crear estos makefiles es una de las
     partes más complicadas de NDK, por
     ello conviene echar una vistazo a los
     ejemplos que vienen para ver otros
     Android.mk que incluyen comentarios.
Android.mk 2/2
Calculadora NDK

# Android.mk debe comenzar con la variable LOCAL_PATH que localiza los
fuentes en el árbol de directorios. En este caso, la macro 'my-dir'
devuelve el path del directorio actual.
LOCAL_PATH := $(call my-dir)

# CLEAR_VARS limpia las variables LOCAL_XXX (LOCAL_MODULE,
LOCAL_SRC_FILES...) excepto LOCAL_PATH.
include $(CLEAR_VARS)

# LOCAL_MODULE debe ser definida para identificar cada módulo descrito en
el Android.mk. El nombre debe ser único y no contener espacios. La librería
dinámica recibirá el nombre del módulo, en este caso se generará el fichero
'libsample-calculator.so'.
LOCAL_MODULE    := sample-calculator

# LOCAL_SRC_FILES contiene la lista de ficheros C y/o C++.
LOCAL_SRC_FILES := calculator.c

# Lista de flags de linkado usados durante la compilación.
LOCAL_LDLIBS := -llog

# BUILD_SHARED_LIBRARY indica que el módulo ha acabado indicando qué
compilar. Existe también la variable BUILD_STATIC_LIBRARY para generar una
librería estática.
include $(BUILD_SHARED_LIBRARY)
Compilar y ejecutar
Calculadora NDK



          $ <directorio-proyecto-ndk>/ndk-build


    Se genera la librería 'libsample-calculator.so'
     en la carpeta 'libs'
    Finalmente compilamos el proyecto en Eclipse
     para generar el .APK y ya podemos ejecutarlo
     en el emulador o dispositivo.
What else?

    JNI Types
       Recibir/enviar Strings


    Cómo generar headers
    Invocar Java desde nativo
    Proyectos NDK
    Crystax, librerías comunes C/C++
JNI Types
    What else?



        Primitive Types            Reference Types




    Ejemplo
jint Java_org_gtug_bcn_fegabe_ndk_calculator_Calculator_operate
(JNIEnv *env,jclass clazz, jint value1, jint value2, jstring
operation)
Recibir/enviar Strings
What else?




     jstring to C/C++ strings      construct new String
         GetStringUTFChars               NewStringUTF
       ReleaseStringUTFChars



                   Demo Whatelse

     Con otras referencias como Arrays sucede similar
Generar Headers
What else?



    Utilizando javah podemos generar
     automáticamente los headers en código C


              /bin$ javah -jni
     org.gtug.bcn.fegabe.ndk.calculator
              .WhatelseActivity
Invocar Java desde nativo
    What else?



        Función nativa que invoca método Java
JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {

    jclass cls = (*env)->GetObjectClass(env, obj);
    jmethodID method =(*env)->GetMethodID(env, cls, "callback", "(I)V");
    if (method == 0)
      return;

    (*env)->CallVoidMethod(env, obj, method, depth);
}



        Método Java
         private void callback(int depth) { … }
Proyectos que usan NDK
What else?



    Quake
     code.google.com/p/glesquake

    Quake 2
     code.google.com/p/quake2android

    Quake 3
     code.google.com/p/kwaak3

    Doom
     code.google.com/p/doom-for-android

    Box2D, librería físicas 2D
     code.google.com/p/akjava-android-project

    ARToolkit, librería realidad aumentada
     code.google.com/p/andar
CrystaX NDK
What else?



    Android NDK personalizado con soporte para
     excepciones C++, RTTI y STL
    Muy útil para compilar librerías ya existentes
     con NDK


      http://www.crystax.net/android/ndk.php
Parsec. Ejemplo real NDK

   Shoot'em old-school hecho por IdeaKnow para
    iPhone y Android gracias a NDK
       Addictive gameplay
       Cool vector graphics
       20 amazing levels
       GAME CENTER / Openfeint
        Online achievements & hiscores
       Weapon upgrades
       Bosses
       Items
       Allows to play your own
        music while in-game

parsec.ideaknow.com
Parsec. Experiencia

   90 % código C común
   Cada plataforma implementa:
      ciclo de vida,
      inicialización vista OpenGL,


      gamecenter/openfeint,


      gestión inputs,


      gestión audio


   Lo más complicado: conseguir crear un
    Android.mk para compilarlo (un par de días)
¿Preguntas?
The End




               ¡Gracias!

fernando@ideaknow.com
@fegabe

Más contenido relacionado

PDF
Aprendiendo a usar NDK Android Day(castellano)
PDF
Desarrollo de aplicaciones realmente nativas con NDK
PDF
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_sama
PDF
Gráficos cada vez más rápidos. Cómo usar NDK y RenderScript
PPTX
Librerías nativas
PPT
Java world
PPTX
Lenguaje de programación java. Detalles
PPT
Evasión de Técnicas Forenses
Aprendiendo a usar NDK Android Day(castellano)
Desarrollo de aplicaciones realmente nativas con NDK
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_sama
Gráficos cada vez más rápidos. Cómo usar NDK y RenderScript
Librerías nativas
Java world
Lenguaje de programación java. Detalles
Evasión de Técnicas Forenses

La actualidad más candente (11)

ODP
Java 2010: presente, límites y futuro
PDF
Introducción a jupyter (antes i python notebook)
ODP
Virtualziación de Sistema Operativo: la niña bonita sin novio
PDF
Información básica Java
PPTX
Systemd en Centos 7
PDF
[ES] Introdución a la plataforma java
PDF
Documentación1
ODP
Decompiladores
PDF
Paralela9
PDF
Tema 1 el entorno de desarrollo de java
PPT
Tecnologia Java
Java 2010: presente, límites y futuro
Introducción a jupyter (antes i python notebook)
Virtualziación de Sistema Operativo: la niña bonita sin novio
Información básica Java
Systemd en Centos 7
[ES] Introdución a la plataforma java
Documentación1
Decompiladores
Paralela9
Tema 1 el entorno de desarrollo de java
Tecnologia Java
Publicidad

Similar a Introducción Android NDK (20)

PDF
Sysmana 2016 - Desarrollo seguro de aplicaciones C/C++ en Android con NDK
PDF
"Android de la A a la Z" -- Unidad 3
PDF
Introducción a ndk
DOCX
Android de la A a la Z - Unidad 3
PDF
Intel Android @ HackMTY
PDF
Android de la A a la Z PARTE 2 de 3 ulises gonzalez
PPT
Desarrollo android - 3 - entorno de desarrollo
ODP
Introducción a las Herramientas de Desarrollo para Android
PDF
Introducción a Android: 10 cosas importantes que hay que entender
PDF
Curso de desarrollo de aplicaciones Android - Sesión 1
PDF
DOCX
Componentes necesarios de android docx
PDF
Ingeniería inversa básica en android tomo ii
PDF
Seminario Android (Parte 1) - movilforum
ODP
Compilar y Debug en Android
PDF
Android
PDF
Curso Android tema 1
PDF
Plataformas Android de Intel
PDF
Unidad 2 Primeros pasos con android
Sysmana 2016 - Desarrollo seguro de aplicaciones C/C++ en Android con NDK
"Android de la A a la Z" -- Unidad 3
Introducción a ndk
Android de la A a la Z - Unidad 3
Intel Android @ HackMTY
Android de la A a la Z PARTE 2 de 3 ulises gonzalez
Desarrollo android - 3 - entorno de desarrollo
Introducción a las Herramientas de Desarrollo para Android
Introducción a Android: 10 cosas importantes que hay que entender
Curso de desarrollo de aplicaciones Android - Sesión 1
Componentes necesarios de android docx
Ingeniería inversa básica en android tomo ii
Seminario Android (Parte 1) - movilforum
Compilar y Debug en Android
Android
Curso Android tema 1
Plataformas Android de Intel
Unidad 2 Primeros pasos con android
Publicidad

Último (20)

PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
PDF
clase auditoria informatica 2025.........
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PDF
Estrategia de apoyo tecnología miguel angel solis
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PPT
introduccion a las_web en el 2025_mejoras.ppt
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PPTX
Propuesta BKP servidores con Acronis1.pptx
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PPTX
Sesion 1 de microsoft power point - Clase 1
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
SAP Transportation Management para LSP, TM140 Col18
PDF
Diapositiva proyecto de vida, materia catedra
PDF
CyberOps Associate - Cisco Networking Academy
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
El-Gobierno-Electrónico-En-El-Estado-Bolivia
clase auditoria informatica 2025.........
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Estrategia de apoyo tecnología miguel angel solis
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
introduccion a las_web en el 2025_mejoras.ppt
Plantilla para Diseño de Narrativas Transmedia.pdf
Propuesta BKP servidores con Acronis1.pptx
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
Sesion 1 de microsoft power point - Clase 1
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
Zarate Quispe Alex aldayir aplicaciones de internet .docx
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
Calidad desde el Docente y la mejora continua .pdf
SAP Transportation Management para LSP, TM140 Col18
Diapositiva proyecto de vida, materia catedra
CyberOps Associate - Cisco Networking Academy

Introducción Android NDK

  • 1. Introducción Android NDK Barcelona GTUG Marzo 2011 fernando@ideaknow.com @fegabe
  • 2. GTUG, Habemus Logo! designed by Maria Orús Valls maria.orus@gmail.com
  • 3. Introducción  ¿Qué es?  ¿Qué permite?  Librerías incluidas  ¿Cuándo usarlo?
  • 4. ¿Qué es? Conjunto de herramientas para compilar componentes nativos y poder utilizarlos en aplicaciones Android.
  • 5. ¿Qué es? ¡¡¿¿What??!!
  • 6. ¿Qué permite?  Entre otras cosas permite  Utilizar librerías C/C++  Invocar código C/C++ desde Java (y al revés)  OpenGL ES 1.0 y 2.0  Desde NDKr5 (Gingerbread)  Aplicación android escrita completamente en C/C++ (activities nativas)  Acceder input (teclado, touch screen)  Acceder sensores (acelerómetro, brújula...)  Reproducir audio  Recuperar recursos incluidos en el APK (R.*)
  • 7. Librerías incluidas  JNI interface headers  libjnigraphics (Pixel buffer access) header (for  libc (C library) headers Android 2.2 and above).  libm (math library)  A Minimal set of headers headers for C++ support  libz (Zlib compression)  OpenSL ES native audio headers libraries  liblog (Android logging)  Android native application header APIS  OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
  • 8. ¿Cuándo usarlo?  No recomendado para la mayoría de las aplicaciones No siempre aumenta el rendimiento pero siempe incrementa la complejidad  Sospechosos habituales Operaciones de CPU intensivas, que no reserven mucha memoria: procesamiento de señales, simulaciones físicas, juegos...
  • 9. Primeros Pasos  Requisitos  Instalación  Ejemplos
  • 10. Requisitos  Android SDK  Android 1.5 SDK o superior  Sistemas operativos soportados  Windows XP (32-bit) o Vista (32- or 64-bit).  Mac OS X 10.4.8 o superior (x86 only).  Linux (32 o 64-bit).  Herramienta de desarrollo requeridas  GNU Make 3.81 o superior.  Versión reciente de awk.  Para Windows, Cygwin 1.7 o superior.
  • 11. Instalación  Descargar e instalar Android SDK http://developer.android.com/sdk/index.html  Descargar y descomprimir Android NDK http://developer.android.com/sdk/ndk/index.html  Incluir directorio NDK en el PATH export NDK_ROOT=/home/fegabe/android-ndk-r5 export PATH=$PATH:$NDK_ROOT
  • 12. Ejemplos incluidos con NDK  La mejor manera de aprender NDK y saber qué se puede hacer  hello-jni  hello-neon  two-libs  bitmap-plasma  san-angeles  native-activity  hello-gl2  native-plasma
  • 13. Calculadora NDK  Código Java  Código C  Android.mk  Compilar y ejecutar
  • 14. Código Java. Calculator.java Calculadora NDK package org.gtug.bcn.fegabe.ndk.calculator; // Cargamos la librería 'sample-calculator' durante // el arranque de la aplicación. static { System.loadLibrary("sample-calculator"); } // Método nativo que se implementa en la librería // nativa 'sample-calculator', se empaqueta junto a esta // aplicación. Private static native int operate(int value1, int value2, String operation); public static int performOperation(int value1, int value2, String operation) { // Se invoca el método nativo como si fuera un método // normal return operate(value1, value2, operation); }
  • 15. Código C. calculator.c Calculadora NDK // El nombre del método en el código nativo se // forma concatenando el package donde está definido // (org.gtug.bcn.fegabe.ndk.calculator), el nombre de la // clase (Calculator) y el nombre del método (operate) jint Java_org_gtug_bcn_fegabe_ndk_calculator_Calculator_operate (JNIEnv *env,jclass clazz, jint value1, jint value2, jstring operation) { int result = 0; const char* strOperation; strOperation = (*env)->GetStringUTFChars(env, operation, 0); if (strcmp(strOperation, "+") == 0) result = value1 + value2; LOGI("Calculator_operate: %d %s %d = %d", value1, strOperation, value2, result); return result; }
  • 16. Android.mk 1/2 Calculadora NDK  Se trata de un Makefile que describe al compilador de NDK los ficheros C/C++.  Crear estos makefiles es una de las partes más complicadas de NDK, por ello conviene echar una vistazo a los ejemplos que vienen para ver otros Android.mk que incluyen comentarios.
  • 17. Android.mk 2/2 Calculadora NDK # Android.mk debe comenzar con la variable LOCAL_PATH que localiza los fuentes en el árbol de directorios. En este caso, la macro 'my-dir' devuelve el path del directorio actual. LOCAL_PATH := $(call my-dir) # CLEAR_VARS limpia las variables LOCAL_XXX (LOCAL_MODULE, LOCAL_SRC_FILES...) excepto LOCAL_PATH. include $(CLEAR_VARS) # LOCAL_MODULE debe ser definida para identificar cada módulo descrito en el Android.mk. El nombre debe ser único y no contener espacios. La librería dinámica recibirá el nombre del módulo, en este caso se generará el fichero 'libsample-calculator.so'. LOCAL_MODULE := sample-calculator # LOCAL_SRC_FILES contiene la lista de ficheros C y/o C++. LOCAL_SRC_FILES := calculator.c # Lista de flags de linkado usados durante la compilación. LOCAL_LDLIBS := -llog # BUILD_SHARED_LIBRARY indica que el módulo ha acabado indicando qué compilar. Existe también la variable BUILD_STATIC_LIBRARY para generar una librería estática. include $(BUILD_SHARED_LIBRARY)
  • 18. Compilar y ejecutar Calculadora NDK $ <directorio-proyecto-ndk>/ndk-build  Se genera la librería 'libsample-calculator.so' en la carpeta 'libs'  Finalmente compilamos el proyecto en Eclipse para generar el .APK y ya podemos ejecutarlo en el emulador o dispositivo.
  • 19. What else?  JNI Types  Recibir/enviar Strings  Cómo generar headers  Invocar Java desde nativo  Proyectos NDK  Crystax, librerías comunes C/C++
  • 20. JNI Types What else?  Primitive Types  Reference Types  Ejemplo jint Java_org_gtug_bcn_fegabe_ndk_calculator_Calculator_operate (JNIEnv *env,jclass clazz, jint value1, jint value2, jstring operation)
  • 21. Recibir/enviar Strings What else?  jstring to C/C++ strings  construct new String GetStringUTFChars NewStringUTF ReleaseStringUTFChars Demo Whatelse  Con otras referencias como Arrays sucede similar
  • 22. Generar Headers What else?  Utilizando javah podemos generar automáticamente los headers en código C /bin$ javah -jni org.gtug.bcn.fegabe.ndk.calculator .WhatelseActivity
  • 23. Invocar Java desde nativo What else?  Función nativa que invoca método Java JNIEXPORT void JNICALL Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) { jclass cls = (*env)->GetObjectClass(env, obj); jmethodID method =(*env)->GetMethodID(env, cls, "callback", "(I)V"); if (method == 0) return; (*env)->CallVoidMethod(env, obj, method, depth); }  Método Java private void callback(int depth) { … }
  • 24. Proyectos que usan NDK What else?  Quake code.google.com/p/glesquake  Quake 2 code.google.com/p/quake2android  Quake 3 code.google.com/p/kwaak3  Doom code.google.com/p/doom-for-android  Box2D, librería físicas 2D code.google.com/p/akjava-android-project  ARToolkit, librería realidad aumentada code.google.com/p/andar
  • 25. CrystaX NDK What else?  Android NDK personalizado con soporte para excepciones C++, RTTI y STL  Muy útil para compilar librerías ya existentes con NDK http://www.crystax.net/android/ndk.php
  • 26. Parsec. Ejemplo real NDK  Shoot'em old-school hecho por IdeaKnow para iPhone y Android gracias a NDK  Addictive gameplay  Cool vector graphics  20 amazing levels  GAME CENTER / Openfeint Online achievements & hiscores  Weapon upgrades  Bosses  Items  Allows to play your own music while in-game parsec.ideaknow.com
  • 27. Parsec. Experiencia  90 % código C común  Cada plataforma implementa:  ciclo de vida,  inicialización vista OpenGL,  gamecenter/openfeint,  gestión inputs,  gestión audio  Lo más complicado: conseguir crear un Android.mk para compilarlo (un par de días)
  • 29. The End ¡Gracias! fernando@ideaknow.com @fegabe