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

Introducción Android NDK

on

  • 1,494 views

 

Statistics

Views

Total Views
1,494
Views on SlideShare
1,481
Embed Views
13

Actions

Likes
1
Downloads
28
Comments
0

3 Embeds 13

http://www.linkedin.com 8
http://us-w1.rockmelt.com 4
https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Introducción Android NDK Introducción Android NDK Presentation Transcript

  • 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 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é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 habitualesOperaciones 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 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
  • 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.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);}
  • 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;}
  • 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.
  • 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)
  • 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.
  • 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 Ejemplojint Java_org_gtug_bcn_fegabe_ndk_calculator_Calculator_operate(JNIEnv *env,jclass clazz, jint value1, jint value2, jstringoperation)
  • Recibir/enviar StringsWhat else?  jstring to C/C++ strings  construct new String GetStringUTFChars NewStringUTF ReleaseStringUTFChars Demo Whatelse  Con otras referencias como Arrays sucede similar
  • 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
  • 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) { … }
  • 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
  • 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
  • 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
  • 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