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

7,735 views

Published on

Introducción al android ndk durante el Barcelona gtug

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,735
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
117
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

×