Your SlideShare is downloading. ×
Introducción Android NDK
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Introducción Android NDK

1,281
views

Published on

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,281
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
28
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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 compilarcomponentes 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 habitualesOperaciones 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 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. 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.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. 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. 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. 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. 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. 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 Ejemplojint Java_org_gtug_bcn_fegabe_ndk_calculator_Calculator_operate(JNIEnv *env,jclass clazz, jint value1, jint value2, jstringoperation)
  • 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. 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. 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. 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. 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. 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. 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. ¿Preguntas?
  • 29. The End ¡Gracias!fernando@ideaknow.com@fegabe

×