Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Introducción Android NDK                Barcelona GTUG                     Marzo 2011             fernando@ideaknow.com   ...
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 compilarcomponentes 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é...
Librerías incluidas   JNI interface headers         libjnigraphics (Pixel buffer                                   acces...
¿Cuándo usarlo?   No recomendado para la mayoría de las aplicaciones     No siempre aumenta el rendimiento pero siempe   ...
Primeros Pasos             Requisitos             Instalación             Ejemplos
Requisitos   Android SDK      Android 1.5 SDK o superior   Sistemas operativos soportados      Windows XP (32-bit) o V...
Instalación   Descargar e instalar Android SDKhttp://developer.android.com/sdk/index.html   Descargar y descomprimir And...
Ejemplos incluidos con NDK   La mejor manera de aprender NDK y saber qué    se puede hacer   hello-jni               he...
Calculadora NDK   Código Java   Código C   Android.mk   Compilar y ejecutar
Código Java. Calculator.javaCalculadora NDKpackage org.gtug.bcn.fegabe.ndk.calculator;// Cargamos la librería sample-calcu...
Código C. calculator.c    Calculadora NDK// El nombre del método en el código nativo se// forma concatenando el package do...
Android.mk 1/2Calculadora NDK    Se trata de un Makefile que describe     al compilador de NDK los ficheros     C/C++.  ...
Android.mk 2/2Calculadora NDK# Android.mk debe comenzar con la variable LOCAL_PATH que localiza losfuentes en el árbol de ...
Compilar y ejecutarCalculadora NDK          $ <directorio-proyecto-ndk>/ndk-build    Se genera la librería libsample-calc...
What else?    JNI Types       Recibir/enviar Strings    Cómo generar headers    Invocar Java desde nativo    Proyecto...
JNI Types    What else?        Primitive Types            Reference Types    Ejemplojint Java_org_gtug_bcn_fegabe_ndk_c...
Recibir/enviar StringsWhat else?     jstring to C/C++ strings      construct new String         GetStringUTFChars       ...
Generar HeadersWhat else?    Utilizando javah podemos generar     automáticamente los headers en código C              /b...
Invocar Java desde nativo    What else?        Función nativa que invoca método JavaJNIEXPORT void JNICALLJava_Callbacks_...
Proyectos que usan NDKWhat else?    Quake     code.google.com/p/glesquake    Quake 2     code.google.com/p/quake2android...
CrystaX NDKWhat else?    Android NDK personalizado con soporte para     excepciones C++, RTTI y STL    Muy útil para com...
Parsec. Ejemplo real NDK   Shootem old-school hecho por IdeaKnow para    iPhone y Android gracias a NDK       Addictive ...
Parsec. Experiencia   90 % código C común   Cada plataforma implementa:      ciclo de vida,      inicialización vista ...
¿Preguntas?
The End               ¡Gracias!fernando@ideaknow.com@fegabe
Upcoming SlideShare
Loading in …5
×

Introducción Android NDK

1,511 views

Published on

Published in: Technology
  • Be the first to comment

Introducción Android NDK

  1. 1. Introducción Android NDK Barcelona GTUG Marzo 2011 fernando@ideaknow.com @fegabe
  2. 2. GTUG, Habemus Logo! designed by Maria Orús Valls maria.orus@gmail.com
  3. 3. Introducción  ¿Qué es?  ¿Qué permite?  Librerías incluidas  ¿Cuándo usarlo?
  4. 4. ¿Qué es?Conjunto de herramientas para compilarcomponentes nativos y poder utilizarlos en aplicaciones Android.
  5. 5. ¿Qué es? ¡¡¿¿What??!!
  6. 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. 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. 8. ¿Cuándo usarlo? No recomendado para la mayoría de las aplicaciones No siempre aumenta el rendimiento pero siempe incrementa la complejidad  Sospechosos habitualesOperaciones de CPU intensivas, que no reserven mucha memoria: procesamiento de señales, simulaciones físicas, juegos...
  9. 9. Primeros Pasos  Requisitos  Instalación  Ejemplos
  10. 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. 11. Instalación Descargar e instalar Android SDKhttp://developer.android.com/sdk/index.html Descargar y descomprimir Android NDKhttp://developer.android.com/sdk/ndk/index.html Incluir directorio NDK en el PATHexport NDK_ROOT=/home/fegabe/android-ndk-r5export PATH=$PATH:$NDK_ROOT
  12. 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. 13. Calculadora NDK Código Java Código C Android.mk Compilar y ejecutar
  14. 14. Código Java. Calculator.javaCalculadora NDKpackage 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. 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, jstringoperation) { 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. 16. Android.mk 1/2Calculadora 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. 17. Android.mk 2/2Calculadora NDK# Android.mk debe comenzar con la variable LOCAL_PATH que localiza losfuentes en el árbol de directorios. En este caso, la macro my-dirdevuelve 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 enel Android.mk. El nombre debe ser único y no contener espacios. La libreríadinámica recibirá el nombre del módulo, en este caso se generará el ficherolibsample-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 unalibrería estática.include $(BUILD_SHARED_LIBRARY)
  18. 18. Compilar y ejecutarCalculadora 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. 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. 20. JNI Types What else?  Primitive Types  Reference Types Ejemplojint Java_org_gtug_bcn_fegabe_ndk_calculator_Calculator_operate(JNIEnv *env,jclass clazz, jint value1, jint value2, jstringoperation)
  21. 21. Recibir/enviar StringsWhat else?  jstring to C/C++ strings  construct new String GetStringUTFChars NewStringUTF ReleaseStringUTFChars Demo Whatelse  Con otras referencias como Arrays sucede similar
  22. 22. Generar HeadersWhat else?  Utilizando javah podemos generar automáticamente los headers en código C /bin$ javah -jni org.gtug.bcn.fegabe.ndk.calculator .WhatelseActivity
  23. 23. Invocar Java desde nativo What else?  Función nativa que invoca método JavaJNIEXPORT void JNICALLJava_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. 24. Proyectos que usan NDKWhat 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. 25. CrystaX NDKWhat 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. 26. Parsec. Ejemplo real NDK Shootem 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-gameparsec.ideaknow.com
  27. 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)
  28. 28. ¿Preguntas?
  29. 29. The End ¡Gracias!fernando@ideaknow.com@fegabe

×