Your SlideShare is downloading. ×
Gráficos cada vez más rápidos. Cómo usar NDK y RenderScript
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

Gráficos cada vez más rápidos. Cómo usar NDK y RenderScript

1,429
views

Published on

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,429
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
55
Comments
0
Likes
0
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. Motorola Mobility Peter van der Linden Evangelista de la tecnología Android Plataformas y Servicios del DesarrolladorGráficos cada vez más rápidos. Cómo usarNDK y RenderScript
  • 2. MOTODEV App Summit 2011 Page 21 CÓMO INSTALAR LAS HERRAMIENTAS2 ESCRIBA SU CÓDIGO3 CREE SU CÓDIGO4 CÓMO LLAMAR A C DESDE JAVA (la JNI)5 RESUMEN. Síntesis, Control de calidad © 2011 Motorola Mobility, © 2011 Motorola Mobility, Inc. Inc. Versión 1.0
  • 3. MOTODEV App Summit 2011 Page 3¿POR QUÉ C/C++ CÓDIGO EN ANDROID? • Open GL • Desempeño • Puerto © 2011 Motorola Mobility, Inc.
  • 4. MOTODEV App Summit 2011 Page 4Limitaciones de NDK C++ •  Originalmente para escribir partes críticas de desempeño del código en C •  No necesita una abstracción POO para eso (y Dalvik VM es mucho más rápido, con el compilador JIT desde 2.2) •  El soporte de C++ es algo limitado •  no tiene soporte para las excepciones •  conocidas como bugs en invocaciones de destructor/ constructor estático •  De manera es más probable que el código NDK se escriba en C en lugar de C++ © 2011 Motorola Mobility, Inc.
  • 5. MOTODEV App Summit 2011 Page 5Arquitecturas CON SOPORTE DE CPU •  NDK soporta dos conjuntos de instrucción ARM: •  ARMv5TE (incluye instrucciones Thumb-1). Este es el destino predeterminado y el código compilado para que esto se ejecute en todos los dispositivos basados en ARM Android. Elija otro destino al cambiar una línea en el archivo Application.mk. •  ARMv7-A (incluye Thumb-2 e instrucciones VFPv3-D16 con soporte opcional para instrucciones NEON/VFPv3- D32). El código compilado para ARMv7-A se ejecutará sólo en dispositivos, tales como Verizon Droid o Motorola XOOM que tienen v7 CPU. El código para NEON se ejecutará sólo en un ARMv7 con soporte para NEON. •  Hay una tercera arquitectura "en los trabajos" (experimental, sin soporte): •  conjunto de instrucciones x86 © 2011 Motorola Mobility, Inc.
  • 6. CÓMO INSTALAR LASHERRAMIENTAS MOTOROLA y el logotipo estilizado "M" son marcas de fábrica o marcas registradas de Motorola Trademark Holdings, Versión 1.0 LLC. Todas las demás marcas comerciales son propiedad de sus respectivos dueños. © 2011 Motorola Mobility, Inc. Todos los derechos reservados.
  • 7. MOTODEV App Summit 2011 Page 7Cómo descargar el Native Development Kit • Verifique compatibilidad: XP o Vista, MacOS X 10.5, Ubuntu • Descargue el archivo comprimido de 50 MB o el archivo tar.bz2 desde: http://developer.android.com/sdk/ndk/index.html • Descomprímalo en el lugar que elija; recuerde dónde en $NDK export NDK=~/android-ndk-r5b • Requiere GNU make y GNU awk! Usuarios de Windows: instalar Cygwin 1.7 o superior © 2011 Motorola Mobility, Inc.
  • 8. MOTODEV App Summit 2011 Page 8Usuarios de Windows •  Descargar e instalar Cygwin 1.7 o superior •  Herramientas de la línea de comando Unix/Linux para los usuarios de Windows http://cygwin.com © 2011 Motorola Mobility, Inc.
  • 9. MOTODEV App Summit 2011 Page 9Sugerencias para Windows y MacOS X• No dejar espacios en los nombres de rutas. ¡En ningún lugar!• Cygwin sólo instala los paquetes base.• Usted necesita los paquetes de desarrollo. Es más fácil instalar la rama completa de Devel. 1.  Ejecute setup.exe . 2.  Haga clic en la palabra "Default" al lado del nódulo Devel de la raíz. 3.  "Default" cambia a "Install" para el nódulo Devel. 4.  Haga clic en "next” para instalar. Vaya a almorzar mientras se instala. 5.  Deje que cree un icono de la consola cygwin en su computadora. 6.  Escriba "make –v" en la consola de cygwin para © 2011 Motorola Mobility, Inc. verificar que está bien.
  • 10. MOTODEV App Summit 2011 Page 10Abra el Native Development Kit• Hay 7 carpetas y varias cosas para leer: © 2011 Motorola Mobility, Inc.
  • 11. MOTODEV App Summit 2011 Page 11Carpetas NDK • build : 4 carpetas con notas de awk & shell, archivos makefiles para construir sus archivos C/C++ • docs: alrededor de 20 archivos de texto (preguntas frecuentes sobre NDK); acceda a ellas en documentation.html • platforms: archivos .h y system library.so p/los distintos niveles IPA • samples: una docena de ejemplos • sources: algunas fuentes para asuntos relacionados con el sistema • tests: notas para probar el mismo NDK. Probablemente aquí por error. • toolchains: cadena de herramientas para cross-compilación © 2011 Motorola Mobility, Inc.
  • 12. MOTODEV App Summit 2011 Page 12Agregar soporte C/C++ a Eclipse•  Eclipse tiene un plugin para C/C++, como para Android•  Cómo usar Eclipse Help > Install new software•  Escriba http://download.eclipse.org/releases/helios/ en el campo "work with" (o en la versión que use)•  Advertencias habituales sobre proxies de la red en el trabajo (configúrelas en MOTODEV Studio > Preferences > Network Conn.)•  Haga clic en Programming Langs > C/C++ Development Tools © 2011 Motorola Mobility, Inc.
  • 13. MOTODEV App Summit 2011 Page 13 •  Hay un plugin para C/C++, como para Android •  Cómo usar Eclipse Help > Install new software © 2011 Motorola Mobility, Inc.
  • 14. Escriba su código C MOTOROLA y el logotipo estilizado "M" son marcas de fábrica o marcas registradas de Motorola Trademark Holdings, LLC. Todas las demás marcas comerciales son propiedad de sus respectivos dueños. © 2011 Motorola Mobility, Inc. Todos los derechos reservados.
  • 15. MOTODEV App Summit 2011 Page 15Enfoque general • Comience con una aplicación Java Android y agréguele piezas de NDK • Ponga sus fuentes nativas C/C++ en $PROJECT/jni: • Construya su código nativo en las bibliotecas. • Su código Android Java puede recibir estas bibliotecas nativas • El código nativo puede también retornar a Java y acceder a objetos de Java © 2011 Motorola Mobility, Inc.
  • 16. MOTODEV App Summit 2011 Page 16 Cree el proyecto Android de la manera habitual © 2011 Motorola Mobility, Inc.
  • 17. MOTODEV App Summit 2011 Page 17Cree la carpeta jni para su proyecto •  Resalte el proyecto Eclipse que usará el código nativo •  El nombre de su paquete se usa para acceder al código nativo, por eso, hágalo corto y simple, ej. "com.greet" p/ fines de capacitación •  File > New > Folder •  póngale el nombre "jni" •  Dentro de esa carpeta jni recién creada, agregaremos •  un archivo makefile •  algunos archivos C © 2011 Motorola Mobility, Inc.
  • 18. MOTODEV App Summit 2011 Page 18Agregue dos archivos a la carpeta "jni" en suproyecto •  File > New > Other … •  Seleccione "General", luego "file", luego navegue •  Seleccione la carpeta jni c/un nombre de archivo "Android.mk">Finish •  Repita, al crear un archivo "myhello.c", también en la carpeta jni •  Eso le da •  jni/Android.mk •  jni/myhello.c © 2011 Motorola Mobility, Inc.
  • 19. MOTODEV App Summit 2011 Page 19Complete la carpeta jnien la carpeta jni Cómo crear archivos en su proyecto salud ar © 2011 Motorola Mobility, Inc.
  • 20. MOTODEV App Summit 2011 Page 20Cómo crear mkfile en la carpeta jni © 2011 Motorola Mobility, Inc.
  • 21. MOTODEV App Summit 2011 Page 21Complete el archivo Android.mk makefile •  Corrija el archivo jni/Android.mk que recién creó •  Ponga estas palabras mágicas en makefile LOCAL_PATH := $(call my-dir)! include $(CLEAR_VARS)! # numere nuestro archivo fuente y la biblioteca! # desde él! LOCAL_MODULE := hello! LOCAL_SRC_FILES := hello.c! include $(BUILD_SHARED_LIBRARY)! © 2011 Motorola Mobility, Inc.
  • 22. MOTODEV App Summit 2011 Page 22Acerca de make •  Make fue creado por Stu Feldman en 1977 en los Laboratorios Bell •  En 2003, Dr. Feldman recibió el premio ACM Software System Award por publicar esta herramienta de gran difusión. •  Usted no sabía de mí, pero el conocimiento del software tiene eso que… # cada comando que sigue la línea de dependencia, # por ejemplo, el DESTINO a la izquierda, debe ser indentado por un # caracter de TAB. target: component-to-build <TAB>commands-to-build-it! © 2011 Motorola Mobility, Inc.
  • 23. MOTODEV App Summit 2011 Page 23Cree el código C en su carpeta jni • Corrija el archivo jni/myhello.c que recién creó • Ponga estas palabras mágicas en el archivo • Usa el objeto JNIEnv p/crear 1 cadena Java desde 1 literal #include <string.h> #include <jni.h> jstring Java_com_greet_MyActivity_myCFunction (JNIEnv* env, jobject javaThis) { return (*env)->NewStringUTF(env, "Hello from native code!"); } © 2011 Motorola Mobility, Inc.
  • 24. MOTODEV App Summit 2011 Page 24Código C explicado Cuando JVM invoca una función nativa, pasa •  un puntero JNIEnv (estructura que tiene la interfaz a JVM p/C) •  un puntero jobject (el objeto "this") •  cualquier argumento Java declarado por el método Java. Estos tipos vienen de #include <jni.h> (consulte en "platforms") Su método C debe escribirse para esperar estos argumentos El método C se denomina "Java"_classname_activity_methodname #include <string.h> #include <jni.h> jstring Java_com_greet_MyActivity_myCFunction (JNIEnv* env, jobject javaThis) { return (*env)->NewStringUTF(env, "Hello from native code!"); }! •  … parece, pero no es, ¿una pérdida de memoria? © 2011 Motorola Mobility, Inc.
  • 25. Cree su código C MOTOROLA y el logotipo estilizado "M" son marcas de fábrica o marcas registradas de Motorola Trademark Holdings, LLC. Todas las demás marcas comerciales son propiedad de sus respectivos dueños. © 2011 Motorola Mobility, Inc. Todos los derechos reservados.
  • 26. MOTODEV App Summit 2011 Page 26Cómo llamar entre idiomas • Android sigue el camino estándar para hablar entre Java yC • JNI: Java Native Interface (Interfaz nativa Java) • Enlace a documentos JNI http://java.sun.com/docs/books/jni/ • Eso incluye un libro completo, un tutorial, ejemplos, etc. © 2011 Motorola Mobility, Inc.
  • 27. MOTODEV App Summit 2011 Page 27Cree su biblioteca C •  Traiga 1 emulador de terminal y cd en su carpeta jni d/proyecto •  Use la nota "ndk-build" del directorio NDK (un contenido adicional GNU Make) (puede poner $NDK en su ruta, si desea) •  La nota compila su código C, lo convierte en una biblioteca compartida •  Pasa libhello.so a una nueva carpeta de proyecto libs/armeabi © 2011 Motorola Mobility, Inc.
  • 28. MOTODEV App Summit 2011 Page 28Enfoque general para crear una biblioteca •  Guarde los archivos en Eclipse •  Traiga un emulador de terminal y cd en su carpeta jni del proyecto •  Ejecute el script ndk-build para convertir su código C en un .so •  Ese lib*.so se agregará en su archivo de aplicación .apk •  File > Refresh en Eclipse (para sincronizar con el sistema de archivos)$ cd MYECLIPSEPROJECT/jni!$ $NDK/ndk-build !Compilar thumb : hello <= hello.c!SharedLibrary : libhello.so!Instalar : libhello.so => libs/armeabi/libhello.so! © 2011 Motorola Mobility, Inc.
  • 29. MOTODEV App Summit 2011 Page 29CONSTRUYA SU BIBLIOTECA: resumen •  Eclipse no construye su código NDK, GNU Make sí •  El plugin C/C++ le da colores de sintaxis y corrección (solamente) •  Ejecute el scrip "ndk-build" después de cada corrección de su código C •  Luego, haga clic en File > Refresh, (F5), para mantener a Eclipse en sincronismo c/ sus archivos nativos © 2011 Motorola Mobility, Inc.
  • 30. El lado Java de JNI MOTOROLA y el logotipo estilizado "M" son marcas de fábrica o marcas registradas de Motorola Trademark Holdings, LLC. Todas las demás marcas comerciales son propiedad de sus respectivos dueños. © 2011 Motorola Mobility, Inc. Todos los derechos reservados.
  • 31. MOTODEV App Summit 2011 Page 31El código Java que llama al código nativo •  Comience c/la aplicación básica que le da Eclipsepackage com.greet;!import android.app.Activity;!import android.os.Bundle;!public class MyActivity extends Activity {! /** Llamado cuando la actividad se crea por primeravez. */! @Override! public void onCreate(Bundle savedInstanceState) {! super.onCreate(savedInstanceState);! setContentView(R.layout.main);! }!}! © 2011 Motorola Mobility, Inc.
  • 32. MOTODEV App Summit 2011 Page 32Agregar la carga de biblioteca •  Agregue la llamada para cargar nuestra biblioteca nativa libhello.so •  el nombre debe coincidir con el nombre de la biblioteca sin "lib" ni ".so“ •  entonces libhello.so es "hello"static {! System.loadLibrary("hello");!}! © 2011 Motorola Mobility, Inc.
  • 33. MOTODEV App Summit 2011 Page 33Agregar la declaración de la función nativa •  Agregar la declaración del prototipo de la función C •  Del lado de C, tiene dos argumentos explícitos, un envp, un this •  Del lado de Java, esos argumentos son implícitosprivate native String myCFunction(); ! © 2011 Motorola Mobility, Inc.
  • 34. MOTODEV App Summit 2011 Page 34Agregar el llamado a la función nativa •  Vamos a obtener la cadena de C y mostrarla como una notificación (“toast”). import static android.widget.Toast.*;! import android.widget.Toast;! . . .! String msg = myCFunction();! Toast.makeText(this, msg, LENGTH_LONG).show();! © 2011 Motorola Mobility, Inc.
  • 35. MOTODEV App Summit 2011 Page 35Cómo juntamos las piezas package com.greet;! Import android.app.Activity;! import android.os.Bundle;! import static android.widget.Toast.*;! import android.widget.Toast;! public class MyActivity extends Activity {! static { System.loadLibrary("hello"); }! private native String myCFunction(); ! @Override! public void onCreate(Bundle savedInstanceState) {! super.onCreate(savedInstanceState);! setContentView(R.layout.main);! String msg = myCFunction();! Toast.makeText(this, msg, LENGTH_LONG).show();! }! }! © 2011 Motorola Mobility, Inc.
  • 36. MOTODEV App Summit 2011 Page 36 © 2011 Motorola Mobility, Inc.
  • 37. Resumen
  • 38. MOTODEV App Summit 2011 Page 38EL COMIENZO Este puede ser un hermoso comienzo de un largo camino • http://groups.google.com/group/android-ndk/topics •  http://java.sun.com/docs/books/jni/ • http://developer.android.com/sdk/ndk/index.html © 2011 Motorola Mobility, Inc.
  • 39. MOTODEV App Summit 2011 Page Página39Renderscript•  Nuevo, API de gráficos en 3D de alto desempeño•  Se usó en Froyo para papel tapiz en vivo•  Se usa en Honeycomb para aplicaciones de Books y YouTube•  Honeycomb presenta Renderscript como una API pública•  Para código crítico de desempeño donde las API del marco tradicional Open GL ES no son los suficientemente rápidas. © 2010 Motorola Mobility, Inc. Versión 1.0 © 2011 Motorola Mobility, Inc.
  • 40. MOTODEV App Summit 2011 Page Página40Ejemplo de Renderscript © 2010 Motorola Mobility, Inc. Versión 1.0 © 2011 Motorola Mobility, Inc.
  • 41. MOTODEV App Summit 2011 Page Página41App Books y Renderscript © 2010 Motorola Mobility, Inc. Versión 1.0 © 2011 Motorola Mobility, Inc.
  • 42. MOTODEV App Summit 2011 Page Página42API de Renderscript•  Una API de "computing" para localizar puntos móviles en 3D•  Una API de "rendering" para dibujar texturas sobre los puntos•  Un lenguaje de script basado en C para acceder a esta API•  Única meta: exprimir hasta la última onza de desempeño de los gráficos•  Enfoque: API es una capa delgada sobre las características con soporte de hardware•  http://community.developer.motorola.com/t5/MOTODEV-Blog/ Introduction-to-Renderscript/ba-p/12136 © 2010 Motorola Mobility, Inc. Versión 1.0 © 2011 Motorola Mobility, Inc.
  • 43. MOTODEV App Summit 2011 Page Página43API de Renderscript•  Android construye elementos que compilan su archivo Renderscript .rs a bytecode intermedio•  Y lo empaquetan dentro de su archivo de aplicación .apk•  En el dispositivo, el bytecode se compila (justo a tiempo – JIT) en el código de máquina que se optimiza para el dispositivo exacto que se está ejecutando•  El código de la máquina se pone en caché para uso futuro•  Así se elimina la necesidad de apuntar a una arquitectura específica durante le proceso de desarrollo. ¡Excelente! © 2011 Motorola Mobility, Inc.
  • 44. MOTODEV App Summit 2011 Page Página44Ejemplo de archivo .rs (de muestras de Honeycomb) #pragma rs java_package_name(com.android.rs.helloworld)! #include "rs_graphics.rsh" // header de API de gráficos! // gTouchX y gTouchY son variables que se reflejarán para uso! // por la API de java. Podemos usarlas para notificar la nota de! // eventos táctiles.! int gTouchX;! int gTouchY;! // Esto se invoca automáticamente cuando se crean las instrucciones! void init() {! gTouchX = 50.0f;! gTouchY = 50.0f;! }! int root(int launchID) {! // Borrar el color de fondo! rsgClearColor(0.0f, 0.0f, 0.0f, 0.0f);! // Decir al tiempo de ejecución cuál será el color de la fuente! rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);! // Presentarnos al mundo al diseñar un saludo! // en la posición que el usuario tocó la pantalla! rsgDrawText("Hello World!", gTouchX, gTouchY);! // El valor de retorno le dice a RS la frecuencia para rediseñar! // en este caso 20 ms! © 2011 Versión 1.0 Motorola Mobility, Inc. return 20;! }!
  • 45. MOTODEV App Summit 2011 Page 45 ¿Desea  formular  alguna   pregunta? Brasil - #appsum11br Argentina - #appsum11ar México - #appsum11mx community.developer.motorola.com © 2011 Motorola Mobility, Inc.
  • 46. MOTODEV App Summit 2011 Page 46 gracias © 2011 Motorola Mobility, Inc.
  • 47. MOTODEV App Summit 2011 Page 47LicenciasLos ejemplos del código fuente que se exhiben en esta presentación pueden estar bajo la licencia de Apache, Versión 2 según lo siguiente: Copyright © 2010, Android Open Source Project. Todos los derechos reservados, salvo indicación expresa en contrario. Con licencia de Apache, Versión 2.0 (la "Licencia"); no podrá usar este archivo, salvo que cumpla con lo que establece la Licencia. Puede conseguir una copia de la licencia en http://www.apache.org/licenses/LICENSE-2.0. Salvo que lo exija la legislación vigente o se preste conformidad por escrito, el software se distribuye bajo la Licencia "EN EL ESTADO EN QUE SE ENCUENTRA", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, explícitas o implícitas. Consulte la Licencia para ver los permisos y las limitaciones que rigen para la Licencia según el idioma específico. © 2011 Motorola Mobility, Inc.
  • 48. MOTODEV App Summit 2011 Page 48LicenciasLos ejemplos del código fuente que se muestran en esta presentación pueden estar bajo la licencia BSD, según lo siguiente:Copyright © 2010-2011, Motorola, Inc. Todos los derechos reservados, salvo indicación expresa en contrario.Se permite la redistribución y el uso en forma de fuente o binaria, con o sin modificación, siempre y cuando se cumpla con las siguientes condiciones: Las redistribuciones del código fuente deben conservar el aviso de derechos de autor arriba mencionado, la presente lista de condiciones y el siguiente descargo de responsabilidad. Las redistribuciones en forma binaria deben reproducir el aviso de derechos de autor arriba mencionado, la presente lista de condiciones y el siguiente descargo de responsabilidad en la documentación y/u otros materiales suministrados con la distribución. Ni el nombre de Motorola, Inc. ni los nombres de sus distribuidores pueden usarse para avalar o promover productos que deriven de este software sin previa autorización específica por escrito.EL PRESENTE SOFTWARE SE SUMINISTRA POR LOS TITULARES DE LOS DERECHOS DE AUTOR Y CONTRIBUYENTES EN EL ESTADO "EN QUE SE ENCUENTRA" Y SE RECHAZA TODA RESPONSABILIDAD DE GARANTÍA IMPLÍCITA O EXPLÍCITA, A TÍTULO ENUNCIATIVO, LAS GARANTÍAS IMPLÍCITAS DE COMERCIALIZACIÓN Y DE APTITUD PARA UN PROPÓSITO PARTICULAR. EN NINGÚN CASO PODRÁ EL TITULAR DE LOS DERECHOS DE AUTOR O LOS CONTRIBUYENTES SER RESPONSABLE POR NINGÚN DAÑO Y PERJUICIO DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, PUNITIVO, O CONSECUENCIAL (A TÍTULO ENUNCIATIVO DE ABASTECIMIENTO DE BIENES O SERVICIOS DE SUSTITUCIÓN; PÉRDIDA DE USO, DATOS O GANANCIAS O INTERRUPCIÓN DE ACTIVIDADES) INDEPENDIENTEMENTE DE SU ORIGEN Y DE TODA TEORÍA DE RESPONSABILIDAD, YA SEA EN EL CONTRATO, RESPONSABILIDAD ESTRICTA O POR LESIÓN JURÍDICA (INCLUSO NEGLIGENCIA O DE OTRO MODO) QUE SURJA DE ALGUNA MANERA DEL USO DE ESTE SOFTWARE, INCLUSO SI SE ADVIRTIÓ DE LA POSIBILIDAD DE DICHO DAÑO. © 2011 Motorola Mobility, Inc.
  • 49. MOTODEV App Summit 2011 Page 49 © 2011 Motorola Mobility, Inc.