SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
Usando el NDK (Native Development Kit) de Android*
Xavier Hallade, Technical Marketing Engineer
@ph0b - ph0b.com
3
Agenda
• El NDK (Native Development Kit) de Android*
• Desarrollando una aplicación que utiliza el NDK
• Soportando diferentes arquitecturas de CPU
• Depuración (debug) y optimización
• Q&A
4
NDK (Native Development Kit) de Android*
Qué es?
 Un build de scripts/toolkit para incorporar código nativo en aplicaciones Android* a través
de la Java Native Interface (JNI)
Por qué utilizarlo?
 Performance
 e.g., algoritmos complejos, aplicaciones multimedia, juegos
 Diferenciación
 Aplicaciones que toman ventaja de acceder directamente a la CPU/HW
 e.g., utilizando SSSE3 para optimización
 Animaciones fluidas sin cortes o interrupciones
 Re-utilización de código
Por qué no utilizarlo?
 La mejora en performance no siempre está garantizada y estamos agregando
complejidad.
5
Código
C/C++
Makefile
ndk-
build
Mix con
Java*
GDB
debug
Java Framework
SDK APIs
JNI
Librerías nativas
Aplicación Android*
NDK APIs
Librería Bionic C
Desarrollo de una aplicación NDK
Using JNI
6
Plataforma NDK
Aplicación Android* NDK
Aplicación Dalvik*
Archivos
.class
Fuente Java
Compilar con
Javac
Librería nativa
Java .class
Librería nativa Java*
Compilar con
Javac
Crear header C con javah -
jni
Archivo HeaderCódigo fuente C/C++
Compilar y linkear Código C
Librería dinámica
Archivos de la
aplicación
Makefile
Opcional gracias a
JNI_Onload
7
Compatibilidad con C/C++ Standard
Librería Bionic C:
 Más liviana que que la librería GNU C standard
 No compatible con POSIX
 Incluye soporte de pthread, pero limitado
 Sin System-V IPCs
 Acceso a las propiedades del sistema Android*
Bionic no es compatible en relación al binario con la librería C standard
Esto significa que generalmente deberás (re)compilar todo utilizando la toolchain del NDK
Android.
8
Soporte Android* para C++
Por defecto se utiliza el sistema. Le falta:
 Soporte de librería standard C++ (excepto algunos headers)
 Soporte a excepciones de C++
 Soporte RTTI
Afortunadamente, tienes otras librerías disponibles con el NDK:
Runtime Exceptions RTTI STL
system No No No
gabi++ Sí Sí No
stlport Sí Sí Sí
gnustl Sí Sí Sí
libc++ Sí Sí Sí
Elige contra qué librería quieres
compilar en tu Makefile
(Application.mk file):
APP_STL := gnustl_shared
Postfix el runtime con _static o
_shared
Para utilizar capacidades C++, también debes habilitarlas en tu Makefile:
LOCAL_CPP_FEATURES += exceptions rtti
9
PSI
TS
PIDs
Instalando el NDK Android*
NDK es un archive dependiente de la plataforma:
Provee:
 Un ambiente de build
 Headers y librerías Android*
 Documentación y muestras de código
(muy útiles)
Puedes integrar con Eclipse ADT:
10
Estructura Standard de un proyecto
Android*
Fuentes nativas – carpeta JNI
1. Creación de la carpeta
JNI para las Fuentes
nativas
3. Creación del Makefile
Android.mk
4. Construir librerías nativas
usando el script NDK-BUILD
2. Reutiliza o crea Fuentes
nativas c/c++
NDK-BUILD creará
automáticamente las carpetas
de librerías ABI.
Agregar manualmente código nativo a un proyecto Android*
11
Agregar soporte NDK a tu proyecto Android* en Eclipse
12
Android* NDK Samples
App de muestra Tipo
hello-jni
Llama a una función nativa escrita en C desde
Java*.
bitmap-plasma Accede a un objeto Android* Bitmap desde C.
san-angeles Códiog EGL y OpenGL* ES en C.
hello-gl2 Setup EGL en Java y código OpenGL ES en C.
native-activity
Muestra OpenGL solo en C
(sin Java, usa la clase NativeActivity).
native-plasma
Muestra OpenGL solo en C
(también usa la clase NativeActivity).
…
13
El foco en Actividades Nativas
Sólo código nativo en el proyecto
android_main(): es el punto de entrada en su propio hilo de ejecución
Event loop to get input data and frame drawing messages
/**
* This is the main entry point of a native application that is using
* android_native_app_glue. It runs in its own thread, with its own
* event loop for receiving input events and doing other things.
*/
void android_main(struct android_app* state);
“Éste es el punto de entrada principal a una app nativa que utiliza android_native_app_glue,. corre en su propio hilo
de ejecucion, con su propio bucle de eventos para recibir eventos de entrada y ejecutar otras tareas.”
14
PSI
TS
PIDs
Integrando funciones nativas con Java*
Declara métodos nativos en tu app Android* (Java*) usando la palabra clave “nativa":
public native String stringFromJNI();
Proporciona una librería native compartida construida con el NDK que contiene los métodos usados por tu
aplicación:
libMyLib.so
Tu aplicación deber cargar la librería compartida (antes de usarla… durante la carga de la clase, por ejemplo):
static {
System.loadLibrary("MyLib");
}
Hay dos formas de asociar tu código nativo a los métodos Java: javah y JNI_OnLoad
15
Método Javah
“javah” ayuda a generar automáticamente los headers JNI apropiados basados
en los archivos fuente Java de los archivos compilados de los archivos de clase
Java.
Ejemplo:
> javah –d jni –classpath bin/classes 
com.example.hellojni.HelloJni
Genera el archivo com_example_hellojni_HelloJni.h con esta definción:
JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *, jobject);
16
Javah Method
La función C que será mapeada automáticamente:
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
...
{
...
tv.setText( stringFromJNI() );
...
}
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
17
Método JNI_OnLoad – Por qué?
Método probado
No más sorpresas luego de registrar métodos
Menos propenso a errores al refactorizar
Agregar/eliminar funciones nativas fácilmente
Sin problemas de tabla de símbolos al mezclar código C/C++
La mejor forma para cachear referencias a clases y objetos Java*
18
Método JNI_OnLoad
En tu librería nombra las funciones a tu gusto y declara el mapeo con métodos JVM:
jstring stringFromJNI(JNIEnv* env, jobject thiz)
{ return env->NewStringUTF("Hello from JNI !");}
static JNINativeMethod exposedMethods[] = {
{"stringFromJNI","()Ljava/lang/String;",(void*)stringFromJNI},
}
()Ljava/lang/String; es la firma JNI del método Java*, que puedes recuperar usando la utilidad javap:
> javap -s -classpath binclasses -p com.example.hellojni.HelloJni
Compiled from "HelloJni.java“
…
public native java.lang.String stringFromJNI();
Signature: ()Ljava/lang/String;
…
19
Método JNI_OnLoad
JNI_OnLoad es el punto de entrada de la librería llamado durante la carga.
Aquí aplica el mapeo definido previamente.
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) !=
JNI_OK)
return JNI_ERR;
jclass clazz = env->FindClass("com/example/hellojni/HelloJni");
if(clazz==NULL)
return JNI_ERR;
env->RegisterNatives(clazz, exposedMethods,
sizeof(exposedMethods)/sizeof(JNINativeMethod));
env->DeleteLocalRef(clazz);
return JNI_VERSION_1_6;
}
20
Manejo de memoria en objetos Java*
El manejo de memoria de objetos Java* es realizado por la JVM:
• Tú solo te encargas de las referencias a esos objetos
• Cada vez que obtienes una referencia, debes recordar
eliminarla luego de su uso
• Las referencias locales son eliminadas automáticamente
cuando la llamada nativa vuelve a Java
• Las referencias son locales por defecto
• Las referencias globales solo son creadas por NewGlobalRef()
21
Creando una cadena Java*
La memoria es manejada por la JVM, jstring siempre es una referencia.
Puedes hacer un llamado a DeleteLocalRef() una vez que has terminado con ella.
La diferencia principal de compilar código JNI en C o en C++ es la naturaleza de “env”
como se ve aquí.
Recuerda que más allá de eso, la API es la misma.
C:
jstring string =
(*env)->NewStringUTF(env, "new Java String");
C++:
jstring string = env->NewStringUTF("new Java String");
22
Obteniendo una cadena C/C++ desde una cadena Java*
const char *nativeString = (*env)-
>GetStringUTFChars(javaString, null);
…
(*env)->ReleaseStringUTFChars(env, javaString, nativeString);
//más seguro
int tmpjstrlen = env->GetStringUTFLength(tmpjstr);
char* fname = new char[tmpjstrlen + 1];
env->GetStringUTFRegion(tmpjstr, 0, tmpjstrlen, fname);
fname[tmpjstrlen] = 0;
…
delete fname;
23
Manejando excepciones Java*
// llamar a métodos java puede arrojar excepciones Java
jthrowable ex = (*env)->ExceptionOccurred(env);
if (ex!=NULL) {
(*env)->ExceptionClear(env);
// manejar la excepción
}
(*env)->DeleteLocalRef(env, ex);
24
Tipos primitivos JNI
Tipos Java* Tipos Nativos Descripción
boolean jboolean unsigned 8 bits
byte jbyte signed 8 bits
char jchar unsigned 16 bits
short jshort signed 16 bits
int jint signed 32 bits
long jlong signed 64 bits
float jfloat 32 bits
double jdouble 64 bits
void void N/A
25
Tipos de Referencias JNI
jobject
jclass
jstring
jarray
jobjectArray
jbooleanArray
jbyteArray
jcharArray
jshortArray
jintArray
jlongArray
jfloatArray
jdoubleArray
jthrowable
Los elementos Arrays se manipulan usando
Get<type>ArrayElements() and Get/Set<type>ArrayRegion()
No olvides llamar ReleaseXXX() para cada llamado GetXXX()
26
Llamando métodos Java*
En una instancia de objeto:
jclass clazz = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, clazz, "methodName",
"(…)…");
if (mid != NULL)
(*env)->Call<Type>Method(env, obj, mid, parameters…);
Llamado estático:
jclass clazz = (*env)->FindClass(env, "java/lang/String");
jmethodID mid = (*env)->GetStaticMethodID(env, clazz, "methodName",
"(…)…");
if (mid != NULL)
(*env)->CallStatic<Type>Method(env, clazz, mid, parameters…);
• (…)…: method signature
• Parámetros: lista de parámetros esperados por el método Java*
• <Type>: Java method return type
27
Lanzando excepciones Java*
jclass clazz =
(*env->FindClass(env, "java/lang/Exception");
if (clazz!=NULL)
(*env)->ThrowNew(env, clazz, "Message");
La excepción será lanzada solo cuando la llamada JNI vuelve a
Java*, no romperá la ejecución en curso de código nativo
28
Incluye todos los ABIs seteando APP_ABI a all en jni/Application.mk:
APP_ABI=all
El NDK generará código optimizado para todos los ABIs objetivo
También puedes pasar la variable APP_ABI a ndk-build, y especificar cada ABI:
ndk-build APP_ABI=x86
NDK: configurando los ABIs objetivos
Build ARM v7a libs
Build ARM v5 libs
Build x86 libs
Build mips libs
33
Debugging con logcat
El NDK provee una API de API en <android/log.h>:
Normalmente utilizado a través de este tipo de macro:
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "APPTAG", __VA_ARGS__))
Ejemplo de uso:
LOGI("accelerometer: x=%f y=%f z=%f", x, y, z);
int __android_log_print(int prio, const char *tag,
const char *fmt, ...)
34
Debugging con logcat
Para obtener más información en ejecución de código nativo:
adb shell setprop debug.checkjni 1
(habilitado por defecto en el emulador)
Y para obtener más información sobre depuración de memoria (solo root):
adb shell setprop libc.debug.malloc 1
-> detección de pérdidas
adb shell setprop libc.debug.malloc 10
-> Detección de overrun
adb shell start/stop -> ambiente de reload
35
Debugging con GDB y Eclipse
Soporte nativo debe ser agregado a tu proyecto
Pasa NDK_DEBUG=1 APP_OPTIM=debug al commando ndk-build, desde las
propiedades del proyecto:
La bandera (flag) NDK_DEBUG debería ser automáticamente
seteada para un build de debug pero no ocurre en este caso.
36
Debugging con GDB y Eclipse*
Cuando NDK_DEBUG=1 es especificado, un archivo “gdbserver” se agrega a
tus librerías
37
Debugging con GDB y Eclipse*
Depura tu proyecto como una aplicación nativa Android*:
38
Debugging con GDB y Eclipse
Desde la perspectiva de depuración de Eclipse tu puedes manipular breakpoints
y depurar tu proyecto
Tu aplicación correrá antes de que se adjunte el debugger, los breakpoints que
establezcas cerca del lanzamiento de la app serán ignorados.
40
Flags GCC
ffast-math influence round-off of fp arithmetic and so breaks strict IEEE
compliance
Las otras optimizaciones son completamente seguras
Agrega -ftree-vectorizer-verbose para obtener un reporte de vectorización
ifeq ($(TARGET_ARCH_ABI),x86)
LOCAL_CFLAGS += -ffast-math -mtune=atom -msse3 -mfpmath=sse
else
LOCAL_CFLAGS += ...
endif
LOCAL_CFLAGS += -O3 -ffast-math -mtune=slm -msse4.2 -mfpmath=sse
Para optimizar para la microarquitectura Intel Silvermont (disponible a partir de NDK r9
gcc-4.8 toolchain):
Optimization Notice
Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These
optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any
optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors.
Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides
for more information regarding the specific instruction sets covered by this notice.
Notice revision #20110804
41
Vectorización
Las instrucciones SIMD hasta SSSE3 está disponible en arquitecturas basadas en el procesador
Intel® Atom™, Intel® SSE4.2 en la microarquitectura Intel Silvermont
En ARM*, puedes obtener vectorización a través de las instrucciones de ARM NEON*
Dos formas clásicas de utilizer estas instrucciones:
• Compilador de auto-vectorization
• Intrínseco del compilador
Optimization Notice
Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These
optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any
optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors.
Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides
for more information regarding the specific instruction sets covered by this notice.
Notice revision #20110804
SSSE3, SSE4.2
Vector size: 128 bit
Data types:
• 8, 16, 32, 64 bit integer
• 32 and 64 bit float
VL: 2, 4, 8, 16
X2
Y2
X2◦Y2
X1
Y1
X1◦Y1
X4
Y4
X4◦Y4
X3
Y3
X3◦Y3
127 0
Q&A
xavier.hallade@intel.com
@ph0b – ph0b.com

Weitere ähnliche Inhalte

Was ist angesagt?

Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytestHector Canto
 
Lenguaje Java
Lenguaje JavaLenguaje Java
Lenguaje Javapbcanessa
 
node-db: La excusa perfecta para hablar de C++ y Node.js
node-db: La excusa perfecta para hablar de C++ y Node.jsnode-db: La excusa perfecta para hablar de C++ y Node.js
node-db: La excusa perfecta para hablar de C++ y Node.jsMariano Iglesias
 
Desarrollo de aplicaciones realmente nativas con NDK
Desarrollo de aplicaciones realmente nativas con NDKDesarrollo de aplicaciones realmente nativas con NDK
Desarrollo de aplicaciones realmente nativas con NDKSoftware Guru
 
Portafolio parcial 2
Portafolio parcial 2Portafolio parcial 2
Portafolio parcial 2EmmanuelAv
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaAndres Almiray
 
Realidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapirRealidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapirAgustín Hv
 
Seguridad en PDF - Adobe ¬¬
Seguridad en PDF - Adobe ¬¬Seguridad en PDF - Adobe ¬¬
Seguridad en PDF - Adobe ¬¬Alejandro Ramos
 
Csi: siempre quisiste ser forense
Csi: siempre quisiste ser forenseCsi: siempre quisiste ser forense
Csi: siempre quisiste ser forenseEventos Creativos
 
Estructura basica para_c_++
Estructura basica para_c_++Estructura basica para_c_++
Estructura basica para_c_++heidiromero11
 

Was ist angesagt? (19)

Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytest
 
CUESTIONARIO 2NDA UNIDAD
CUESTIONARIO 2NDA UNIDADCUESTIONARIO 2NDA UNIDAD
CUESTIONARIO 2NDA UNIDAD
 
Lenguaje Java
Lenguaje JavaLenguaje Java
Lenguaje Java
 
Programación con java en Eclipse
Programación con java en EclipseProgramación con java en Eclipse
Programación con java en Eclipse
 
LibreríAs De Java
LibreríAs De JavaLibreríAs De Java
LibreríAs De Java
 
node-db: La excusa perfecta para hablar de C++ y Node.js
node-db: La excusa perfecta para hablar de C++ y Node.jsnode-db: La excusa perfecta para hablar de C++ y Node.js
node-db: La excusa perfecta para hablar de C++ y Node.js
 
Desarrollo de aplicaciones realmente nativas con NDK
Desarrollo de aplicaciones realmente nativas con NDKDesarrollo de aplicaciones realmente nativas con NDK
Desarrollo de aplicaciones realmente nativas con NDK
 
Python para todos
Python para todosPython para todos
Python para todos
 
Portafolio parcial 2
Portafolio parcial 2Portafolio parcial 2
Portafolio parcial 2
 
Taller PyGTK
Taller PyGTKTaller PyGTK
Taller PyGTK
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
 
Realidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapirRealidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapir
 
Decompiladores
DecompiladoresDecompiladores
Decompiladores
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Nikto
Nikto Nikto
Nikto
 
Seguridad en PDF - Adobe ¬¬
Seguridad en PDF - Adobe ¬¬Seguridad en PDF - Adobe ¬¬
Seguridad en PDF - Adobe ¬¬
 
Csi: siempre quisiste ser forense
Csi: siempre quisiste ser forenseCsi: siempre quisiste ser forense
Csi: siempre quisiste ser forense
 
Estructura basica para_c_++
Estructura basica para_c_++Estructura basica para_c_++
Estructura basica para_c_++
 

Andere mochten auch

Welcome to the M2M World - Jonada Movilforum 20feb2014
Welcome to the M2M World - Jonada Movilforum 20feb2014Welcome to the M2M World - Jonada Movilforum 20feb2014
Welcome to the M2M World - Jonada Movilforum 20feb2014videos
 
Movilforum area tecnica
Movilforum area tecnicaMovilforum area tecnica
Movilforum area tecnicavideos
 
Carlos astorqui : El tiempo firefox
Carlos astorqui : El tiempo firefox Carlos astorqui : El tiempo firefox
Carlos astorqui : El tiempo firefox videos
 
Jornada movilforum 2011 - Ayudas ICEX
Jornada movilforum 2011 - Ayudas ICEXJornada movilforum 2011 - Ayudas ICEX
Jornada movilforum 2011 - Ayudas ICEXvideos
 
La educacion en tiempos de tecnologia
La educacion en tiempos de tecnologiaLa educacion en tiempos de tecnologia
La educacion en tiempos de tecnologiaaudrey lara
 
Musicoterapia!
Musicoterapia!Musicoterapia!
Musicoterapia!camila
 
Reacciones Quimicas
Reacciones QuimicasReacciones Quimicas
Reacciones QuimicasElizabeth
 
Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)
Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)
Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)videos
 
Nutrición materna y embarazo
Nutrición materna y embarazoNutrición materna y embarazo
Nutrición materna y embarazoDb0i
 
Herramientas de google
Herramientas de googleHerramientas de google
Herramientas de googlelolota
 
Windows Phone 7, Una Propuesta Diferente Y Una Gran Oportunidad
Windows Phone 7, Una Propuesta Diferente Y Una Gran OportunidadWindows Phone 7, Una Propuesta Diferente Y Una Gran Oportunidad
Windows Phone 7, Una Propuesta Diferente Y Una Gran Oportunidadvideos
 
Aplicateca: Negocios on Air_Telefonica_mfc10
Aplicateca: Negocios on Air_Telefonica_mfc10Aplicateca: Negocios on Air_Telefonica_mfc10
Aplicateca: Negocios on Air_Telefonica_mfc10videos
 
Jornada movilforum 2011 - Movilforum España
Jornada movilforum 2011 - Movilforum EspañaJornada movilforum 2011 - Movilforum España
Jornada movilforum 2011 - Movilforum Españavideos
 
Lina marcela ortiz vargas
Lina marcela ortiz vargasLina marcela ortiz vargas
Lina marcela ortiz vargasgrandu1994
 
JMC12 "La Dinamización del Punto de Venta"
JMC12 "La Dinamización del Punto de Venta"JMC12 "La Dinamización del Punto de Venta"
JMC12 "La Dinamización del Punto de Venta"videos
 
Como rendir una prueba online
Como rendir una prueba onlineComo rendir una prueba online
Como rendir una prueba onlineCecilia
 
JMC12 "Eficiencia energética en la gestión de infraestructuras"
JMC12 "Eficiencia energética en la gestión de infraestructuras"JMC12 "Eficiencia energética en la gestión de infraestructuras"
JMC12 "Eficiencia energética en la gestión de infraestructuras"videos
 
JMC12- Las redes sociales una nueva forma de atención
JMC12- Las redes sociales una nueva forma de atenciónJMC12- Las redes sociales una nueva forma de atención
JMC12- Las redes sociales una nueva forma de atenciónvideos
 
Presentación Movilforum - Jornada 20 de febrero 2014
Presentación Movilforum -  Jornada 20 de febrero 2014Presentación Movilforum -  Jornada 20 de febrero 2014
Presentación Movilforum - Jornada 20 de febrero 2014videos
 

Andere mochten auch (20)

Welcome to the M2M World - Jonada Movilforum 20feb2014
Welcome to the M2M World - Jonada Movilforum 20feb2014Welcome to the M2M World - Jonada Movilforum 20feb2014
Welcome to the M2M World - Jonada Movilforum 20feb2014
 
Movilforum area tecnica
Movilforum area tecnicaMovilforum area tecnica
Movilforum area tecnica
 
Carlos astorqui : El tiempo firefox
Carlos astorqui : El tiempo firefox Carlos astorqui : El tiempo firefox
Carlos astorqui : El tiempo firefox
 
Jornada movilforum 2011 - Ayudas ICEX
Jornada movilforum 2011 - Ayudas ICEXJornada movilforum 2011 - Ayudas ICEX
Jornada movilforum 2011 - Ayudas ICEX
 
La educacion en tiempos de tecnologia
La educacion en tiempos de tecnologiaLa educacion en tiempos de tecnologia
La educacion en tiempos de tecnologia
 
Musicoterapia!
Musicoterapia!Musicoterapia!
Musicoterapia!
 
Reacciones Quimicas
Reacciones QuimicasReacciones Quimicas
Reacciones Quimicas
 
Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)
Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)
Transforma tu empresa ... ¡Movílizate! - Julia Fraile Santos (Movilforum)
 
Nutrición materna y embarazo
Nutrición materna y embarazoNutrición materna y embarazo
Nutrición materna y embarazo
 
Herramientas de google
Herramientas de googleHerramientas de google
Herramientas de google
 
Windows Phone 7, Una Propuesta Diferente Y Una Gran Oportunidad
Windows Phone 7, Una Propuesta Diferente Y Una Gran OportunidadWindows Phone 7, Una Propuesta Diferente Y Una Gran Oportunidad
Windows Phone 7, Una Propuesta Diferente Y Una Gran Oportunidad
 
Ayuda didactica
Ayuda didacticaAyuda didactica
Ayuda didactica
 
Aplicateca: Negocios on Air_Telefonica_mfc10
Aplicateca: Negocios on Air_Telefonica_mfc10Aplicateca: Negocios on Air_Telefonica_mfc10
Aplicateca: Negocios on Air_Telefonica_mfc10
 
Jornada movilforum 2011 - Movilforum España
Jornada movilforum 2011 - Movilforum EspañaJornada movilforum 2011 - Movilforum España
Jornada movilforum 2011 - Movilforum España
 
Lina marcela ortiz vargas
Lina marcela ortiz vargasLina marcela ortiz vargas
Lina marcela ortiz vargas
 
JMC12 "La Dinamización del Punto de Venta"
JMC12 "La Dinamización del Punto de Venta"JMC12 "La Dinamización del Punto de Venta"
JMC12 "La Dinamización del Punto de Venta"
 
Como rendir una prueba online
Como rendir una prueba onlineComo rendir una prueba online
Como rendir una prueba online
 
JMC12 "Eficiencia energética en la gestión de infraestructuras"
JMC12 "Eficiencia energética en la gestión de infraestructuras"JMC12 "Eficiencia energética en la gestión de infraestructuras"
JMC12 "Eficiencia energética en la gestión de infraestructuras"
 
JMC12- Las redes sociales una nueva forma de atención
JMC12- Las redes sociales una nueva forma de atenciónJMC12- Las redes sociales una nueva forma de atención
JMC12- Las redes sociales una nueva forma de atención
 
Presentación Movilforum - Jornada 20 de febrero 2014
Presentación Movilforum -  Jornada 20 de febrero 2014Presentación Movilforum -  Jornada 20 de febrero 2014
Presentación Movilforum - Jornada 20 de febrero 2014
 

Ähnlich wie NDK Android desarrollo nativo

Introducción Android NDK
Introducción Android NDKIntroducción Android NDK
Introducción Android NDKFe
 
Lleva tu Android App al Sigiente Nivel
Lleva tu Android App al Sigiente NivelLleva tu Android App al Sigiente Nivel
Lleva tu Android App al Sigiente NivelSoftware Guru
 
Intel Android @ HackMTY
Intel Android @ HackMTYIntel Android @ HackMTY
Intel Android @ HackMTYSoftware Guru
 
[ES] Primeros pasos con la Plataforma Java
[ES] Primeros pasos con la Plataforma Java[ES] Primeros pasos con la Plataforma Java
[ES] Primeros pasos con la Plataforma JavaEudris Cabrera
 
Optimización de Aplicaciones Android para X86
Optimización de Aplicaciones Android para X86Optimización de Aplicaciones Android para X86
Optimización de Aplicaciones Android para X86Software Guru
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJSBEEVA_es
 
Desarrollo android - 3 - entorno de desarrollo
Desarrollo android  - 3 - entorno de desarrolloDesarrollo android  - 3 - entorno de desarrollo
Desarrollo android - 3 - entorno de desarrolloEmilio Aviles Avila
 
PRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEBPRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEBYeison11020
 
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_sama
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_samaIntroducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_sama
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_samaSoftware Guru
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLabFIB
 
FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020BelnGonzlezGarca1
 

Ähnlich wie NDK Android desarrollo nativo (20)

Introducción Android NDK
Introducción Android NDKIntroducción Android NDK
Introducción Android NDK
 
Lleva tu Android App al Sigiente Nivel
Lleva tu Android App al Sigiente NivelLleva tu Android App al Sigiente Nivel
Lleva tu Android App al Sigiente Nivel
 
Semana9 Vbr
Semana9 VbrSemana9 Vbr
Semana9 Vbr
 
Intel Android @ HackMTY
Intel Android @ HackMTYIntel Android @ HackMTY
Intel Android @ HackMTY
 
Jordan solis (1)
Jordan solis (1)Jordan solis (1)
Jordan solis (1)
 
Traduccion capitulo 9 (completo)
Traduccion capitulo 9 (completo)Traduccion capitulo 9 (completo)
Traduccion capitulo 9 (completo)
 
[ES] Primeros pasos con la Plataforma Java
[ES] Primeros pasos con la Plataforma Java[ES] Primeros pasos con la Plataforma Java
[ES] Primeros pasos con la Plataforma Java
 
Unidad 2. Lenguaje orientado a objetos
Unidad 2. Lenguaje orientado a objetosUnidad 2. Lenguaje orientado a objetos
Unidad 2. Lenguaje orientado a objetos
 
Optimización de Aplicaciones Android para X86
Optimización de Aplicaciones Android para X86Optimización de Aplicaciones Android para X86
Optimización de Aplicaciones Android para X86
 
Java
JavaJava
Java
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Desarrollo android - 3 - entorno de desarrollo
Desarrollo android  - 3 - entorno de desarrolloDesarrollo android  - 3 - entorno de desarrollo
Desarrollo android - 3 - entorno de desarrollo
 
Curso c sharp
Curso c sharpCurso c sharp
Curso c sharp
 
Introducción a ndk
Introducción a ndkIntroducción a ndk
Introducción a ndk
 
Tspe jni-1
Tspe jni-1Tspe jni-1
Tspe jni-1
 
Programacion en C#
Programacion en C#Programacion en C#
Programacion en C#
 
PRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEBPRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEB
 
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_sama
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_samaIntroducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_sama
Introducción al Desarrollo de NDK apps | Dev Day 4 Woman | @condesa_sama
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
 
FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020
 

Mehr von videos

Logros y retos evento movilforum 02/2016
Logros y retos evento movilforum 02/2016Logros y retos evento movilforum 02/2016
Logros y retos evento movilforum 02/2016videos
 
Presentación Atlantida en Networking Day moviforum
Presentación Atlantida en Networking Day moviforum Presentación Atlantida en Networking Day moviforum
Presentación Atlantida en Networking Day moviforum videos
 
Presentación Quetal en Networking Day moviforum
Presentación Quetal  en Networking Day moviforum Presentación Quetal  en Networking Day moviforum
Presentación Quetal en Networking Day moviforum videos
 
Presentación GMTECH en Networking Day moviforum
Presentación GMTECH en Networking Day moviforum Presentación GMTECH en Networking Day moviforum
Presentación GMTECH en Networking Day moviforum videos
 
Presentación movilok en Networking Day moviforum
Presentación movilok en Networking Day moviforum Presentación movilok en Networking Day moviforum
Presentación movilok en Networking Day moviforum videos
 
Presentación 3G mobile en Networking Day moviforum
Presentación 3G mobile en Networking Day moviforumPresentación 3G mobile en Networking Day moviforum
Presentación 3G mobile en Networking Day moviforumvideos
 
Presentación microestrategy en Networking Day moviforum
Presentación microestrategy en Networking Day moviforumPresentación microestrategy en Networking Day moviforum
Presentación microestrategy en Networking Day moviforumvideos
 
Presentación Telnet en Networking Day moviforum
Presentación Telnet en Networking Day moviforumPresentación Telnet en Networking Day moviforum
Presentación Telnet en Networking Day moviforumvideos
 
Presentación Alma technology en Networking Day movilforum
Presentación Alma technology en Networking Day movilforumPresentación Alma technology en Networking Day movilforum
Presentación Alma technology en Networking Day movilforumvideos
 
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...videos
 
Presentación Icar Vision en Networking Day movilforum
Presentación Icar Vision en Networking Day movilforumPresentación Icar Vision en Networking Day movilforum
Presentación Icar Vision en Networking Day movilforumvideos
 
Presentación Billage en Networking Day movilforum
Presentación Billage en Networking Day movilforumPresentación Billage en Networking Day movilforum
Presentación Billage en Networking Day movilforumvideos
 
Presentación Face On en Networking Day movilforum
Presentación Face On en Networking Day movilforumPresentación Face On en Networking Day movilforum
Presentación Face On en Networking Day movilforumvideos
 
Bases legales reto NFV/ Nfv challenge terms
Bases legales reto NFV/ Nfv challenge termsBases legales reto NFV/ Nfv challenge terms
Bases legales reto NFV/ Nfv challenge termsvideos
 
Intrucciones reto NFV/ Instruction to apply to nfv challenge
Intrucciones reto NFV/ Instruction to apply to nfv challengeIntrucciones reto NFV/ Instruction to apply to nfv challenge
Intrucciones reto NFV/ Instruction to apply to nfv challengevideos
 
9 creating cent_os 7_mages_for_dpdk_training
9 creating cent_os 7_mages_for_dpdk_training9 creating cent_os 7_mages_for_dpdk_training
9 creating cent_os 7_mages_for_dpdk_trainingvideos
 
8 intel network builders overview
8 intel network builders overview8 intel network builders overview
8 intel network builders overviewvideos
 
7 hands on
7 hands on7 hands on
7 hands onvideos
 
6 profiling tools
6 profiling tools6 profiling tools
6 profiling toolsvideos
 
5 pipeline arch_rationale
5 pipeline arch_rationale5 pipeline arch_rationale
5 pipeline arch_rationalevideos
 

Mehr von videos (20)

Logros y retos evento movilforum 02/2016
Logros y retos evento movilforum 02/2016Logros y retos evento movilforum 02/2016
Logros y retos evento movilforum 02/2016
 
Presentación Atlantida en Networking Day moviforum
Presentación Atlantida en Networking Day moviforum Presentación Atlantida en Networking Day moviforum
Presentación Atlantida en Networking Day moviforum
 
Presentación Quetal en Networking Day moviforum
Presentación Quetal  en Networking Day moviforum Presentación Quetal  en Networking Day moviforum
Presentación Quetal en Networking Day moviforum
 
Presentación GMTECH en Networking Day moviforum
Presentación GMTECH en Networking Day moviforum Presentación GMTECH en Networking Day moviforum
Presentación GMTECH en Networking Day moviforum
 
Presentación movilok en Networking Day moviforum
Presentación movilok en Networking Day moviforum Presentación movilok en Networking Day moviforum
Presentación movilok en Networking Day moviforum
 
Presentación 3G mobile en Networking Day moviforum
Presentación 3G mobile en Networking Day moviforumPresentación 3G mobile en Networking Day moviforum
Presentación 3G mobile en Networking Day moviforum
 
Presentación microestrategy en Networking Day moviforum
Presentación microestrategy en Networking Day moviforumPresentación microestrategy en Networking Day moviforum
Presentación microestrategy en Networking Day moviforum
 
Presentación Telnet en Networking Day moviforum
Presentación Telnet en Networking Day moviforumPresentación Telnet en Networking Day moviforum
Presentación Telnet en Networking Day moviforum
 
Presentación Alma technology en Networking Day movilforum
Presentación Alma technology en Networking Day movilforumPresentación Alma technology en Networking Day movilforum
Presentación Alma technology en Networking Day movilforum
 
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...
Presentación acuerdo de colaboración Fieldeas y EasyOnPad en Networking Day m...
 
Presentación Icar Vision en Networking Day movilforum
Presentación Icar Vision en Networking Day movilforumPresentación Icar Vision en Networking Day movilforum
Presentación Icar Vision en Networking Day movilforum
 
Presentación Billage en Networking Day movilforum
Presentación Billage en Networking Day movilforumPresentación Billage en Networking Day movilforum
Presentación Billage en Networking Day movilforum
 
Presentación Face On en Networking Day movilforum
Presentación Face On en Networking Day movilforumPresentación Face On en Networking Day movilforum
Presentación Face On en Networking Day movilforum
 
Bases legales reto NFV/ Nfv challenge terms
Bases legales reto NFV/ Nfv challenge termsBases legales reto NFV/ Nfv challenge terms
Bases legales reto NFV/ Nfv challenge terms
 
Intrucciones reto NFV/ Instruction to apply to nfv challenge
Intrucciones reto NFV/ Instruction to apply to nfv challengeIntrucciones reto NFV/ Instruction to apply to nfv challenge
Intrucciones reto NFV/ Instruction to apply to nfv challenge
 
9 creating cent_os 7_mages_for_dpdk_training
9 creating cent_os 7_mages_for_dpdk_training9 creating cent_os 7_mages_for_dpdk_training
9 creating cent_os 7_mages_for_dpdk_training
 
8 intel network builders overview
8 intel network builders overview8 intel network builders overview
8 intel network builders overview
 
7 hands on
7 hands on7 hands on
7 hands on
 
6 profiling tools
6 profiling tools6 profiling tools
6 profiling tools
 
5 pipeline arch_rationale
5 pipeline arch_rationale5 pipeline arch_rationale
5 pipeline arch_rationale
 

Kürzlich hochgeladen

TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888ElianaValencia28
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaElizabethLpezSoto
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaYeimys Ch
 
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxBLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxhellendiaz12
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfJoseAlejandroPerezBa
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdflauralizcano0319
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskbydaniela5
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024anasofiarodriguezcru
 
Trabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalTrabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalEmanuelCastro64
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6SaraMineiropalacio
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 

Kürzlich hochgeladen (18)

TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestría
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
 
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxBLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024
 
Trabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalTrabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamental
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 

NDK Android desarrollo nativo

  • 1. Usando el NDK (Native Development Kit) de Android* Xavier Hallade, Technical Marketing Engineer @ph0b - ph0b.com
  • 2. 3 Agenda • El NDK (Native Development Kit) de Android* • Desarrollando una aplicación que utiliza el NDK • Soportando diferentes arquitecturas de CPU • Depuración (debug) y optimización • Q&A
  • 3. 4 NDK (Native Development Kit) de Android* Qué es?  Un build de scripts/toolkit para incorporar código nativo en aplicaciones Android* a través de la Java Native Interface (JNI) Por qué utilizarlo?  Performance  e.g., algoritmos complejos, aplicaciones multimedia, juegos  Diferenciación  Aplicaciones que toman ventaja de acceder directamente a la CPU/HW  e.g., utilizando SSSE3 para optimización  Animaciones fluidas sin cortes o interrupciones  Re-utilización de código Por qué no utilizarlo?  La mejora en performance no siempre está garantizada y estamos agregando complejidad.
  • 4. 5 Código C/C++ Makefile ndk- build Mix con Java* GDB debug Java Framework SDK APIs JNI Librerías nativas Aplicación Android* NDK APIs Librería Bionic C Desarrollo de una aplicación NDK Using JNI
  • 5. 6 Plataforma NDK Aplicación Android* NDK Aplicación Dalvik* Archivos .class Fuente Java Compilar con Javac Librería nativa Java .class Librería nativa Java* Compilar con Javac Crear header C con javah - jni Archivo HeaderCódigo fuente C/C++ Compilar y linkear Código C Librería dinámica Archivos de la aplicación Makefile Opcional gracias a JNI_Onload
  • 6. 7 Compatibilidad con C/C++ Standard Librería Bionic C:  Más liviana que que la librería GNU C standard  No compatible con POSIX  Incluye soporte de pthread, pero limitado  Sin System-V IPCs  Acceso a las propiedades del sistema Android* Bionic no es compatible en relación al binario con la librería C standard Esto significa que generalmente deberás (re)compilar todo utilizando la toolchain del NDK Android.
  • 7. 8 Soporte Android* para C++ Por defecto se utiliza el sistema. Le falta:  Soporte de librería standard C++ (excepto algunos headers)  Soporte a excepciones de C++  Soporte RTTI Afortunadamente, tienes otras librerías disponibles con el NDK: Runtime Exceptions RTTI STL system No No No gabi++ Sí Sí No stlport Sí Sí Sí gnustl Sí Sí Sí libc++ Sí Sí Sí Elige contra qué librería quieres compilar en tu Makefile (Application.mk file): APP_STL := gnustl_shared Postfix el runtime con _static o _shared Para utilizar capacidades C++, también debes habilitarlas en tu Makefile: LOCAL_CPP_FEATURES += exceptions rtti
  • 8. 9 PSI TS PIDs Instalando el NDK Android* NDK es un archive dependiente de la plataforma: Provee:  Un ambiente de build  Headers y librerías Android*  Documentación y muestras de código (muy útiles) Puedes integrar con Eclipse ADT:
  • 9. 10 Estructura Standard de un proyecto Android* Fuentes nativas – carpeta JNI 1. Creación de la carpeta JNI para las Fuentes nativas 3. Creación del Makefile Android.mk 4. Construir librerías nativas usando el script NDK-BUILD 2. Reutiliza o crea Fuentes nativas c/c++ NDK-BUILD creará automáticamente las carpetas de librerías ABI. Agregar manualmente código nativo a un proyecto Android*
  • 10. 11 Agregar soporte NDK a tu proyecto Android* en Eclipse
  • 11. 12 Android* NDK Samples App de muestra Tipo hello-jni Llama a una función nativa escrita en C desde Java*. bitmap-plasma Accede a un objeto Android* Bitmap desde C. san-angeles Códiog EGL y OpenGL* ES en C. hello-gl2 Setup EGL en Java y código OpenGL ES en C. native-activity Muestra OpenGL solo en C (sin Java, usa la clase NativeActivity). native-plasma Muestra OpenGL solo en C (también usa la clase NativeActivity). …
  • 12. 13 El foco en Actividades Nativas Sólo código nativo en el proyecto android_main(): es el punto de entrada en su propio hilo de ejecución Event loop to get input data and frame drawing messages /** * This is the main entry point of a native application that is using * android_native_app_glue. It runs in its own thread, with its own * event loop for receiving input events and doing other things. */ void android_main(struct android_app* state); “Éste es el punto de entrada principal a una app nativa que utiliza android_native_app_glue,. corre en su propio hilo de ejecucion, con su propio bucle de eventos para recibir eventos de entrada y ejecutar otras tareas.”
  • 13. 14 PSI TS PIDs Integrando funciones nativas con Java* Declara métodos nativos en tu app Android* (Java*) usando la palabra clave “nativa": public native String stringFromJNI(); Proporciona una librería native compartida construida con el NDK que contiene los métodos usados por tu aplicación: libMyLib.so Tu aplicación deber cargar la librería compartida (antes de usarla… durante la carga de la clase, por ejemplo): static { System.loadLibrary("MyLib"); } Hay dos formas de asociar tu código nativo a los métodos Java: javah y JNI_OnLoad
  • 14. 15 Método Javah “javah” ayuda a generar automáticamente los headers JNI apropiados basados en los archivos fuente Java de los archivos compilados de los archivos de clase Java. Ejemplo: > javah –d jni –classpath bin/classes com.example.hellojni.HelloJni Genera el archivo com_example_hellojni_HelloJni.h con esta definción: JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *, jobject);
  • 15. 16 Javah Method La función C que será mapeada automáticamente: jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Hello from JNI !"); } ... { ... tv.setText( stringFromJNI() ); ... } public native String stringFromJNI(); static { System.loadLibrary("hello-jni"); }
  • 16. 17 Método JNI_OnLoad – Por qué? Método probado No más sorpresas luego de registrar métodos Menos propenso a errores al refactorizar Agregar/eliminar funciones nativas fácilmente Sin problemas de tabla de símbolos al mezclar código C/C++ La mejor forma para cachear referencias a clases y objetos Java*
  • 17. 18 Método JNI_OnLoad En tu librería nombra las funciones a tu gusto y declara el mapeo con métodos JVM: jstring stringFromJNI(JNIEnv* env, jobject thiz) { return env->NewStringUTF("Hello from JNI !");} static JNINativeMethod exposedMethods[] = { {"stringFromJNI","()Ljava/lang/String;",(void*)stringFromJNI}, } ()Ljava/lang/String; es la firma JNI del método Java*, que puedes recuperar usando la utilidad javap: > javap -s -classpath binclasses -p com.example.hellojni.HelloJni Compiled from "HelloJni.java“ … public native java.lang.String stringFromJNI(); Signature: ()Ljava/lang/String; …
  • 18. 19 Método JNI_OnLoad JNI_OnLoad es el punto de entrada de la librería llamado durante la carga. Aquí aplica el mapeo definido previamente. extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) return JNI_ERR; jclass clazz = env->FindClass("com/example/hellojni/HelloJni"); if(clazz==NULL) return JNI_ERR; env->RegisterNatives(clazz, exposedMethods, sizeof(exposedMethods)/sizeof(JNINativeMethod)); env->DeleteLocalRef(clazz); return JNI_VERSION_1_6; }
  • 19. 20 Manejo de memoria en objetos Java* El manejo de memoria de objetos Java* es realizado por la JVM: • Tú solo te encargas de las referencias a esos objetos • Cada vez que obtienes una referencia, debes recordar eliminarla luego de su uso • Las referencias locales son eliminadas automáticamente cuando la llamada nativa vuelve a Java • Las referencias son locales por defecto • Las referencias globales solo son creadas por NewGlobalRef()
  • 20. 21 Creando una cadena Java* La memoria es manejada por la JVM, jstring siempre es una referencia. Puedes hacer un llamado a DeleteLocalRef() una vez que has terminado con ella. La diferencia principal de compilar código JNI en C o en C++ es la naturaleza de “env” como se ve aquí. Recuerda que más allá de eso, la API es la misma. C: jstring string = (*env)->NewStringUTF(env, "new Java String"); C++: jstring string = env->NewStringUTF("new Java String");
  • 21. 22 Obteniendo una cadena C/C++ desde una cadena Java* const char *nativeString = (*env)- >GetStringUTFChars(javaString, null); … (*env)->ReleaseStringUTFChars(env, javaString, nativeString); //más seguro int tmpjstrlen = env->GetStringUTFLength(tmpjstr); char* fname = new char[tmpjstrlen + 1]; env->GetStringUTFRegion(tmpjstr, 0, tmpjstrlen, fname); fname[tmpjstrlen] = 0; … delete fname;
  • 22. 23 Manejando excepciones Java* // llamar a métodos java puede arrojar excepciones Java jthrowable ex = (*env)->ExceptionOccurred(env); if (ex!=NULL) { (*env)->ExceptionClear(env); // manejar la excepción } (*env)->DeleteLocalRef(env, ex);
  • 23. 24 Tipos primitivos JNI Tipos Java* Tipos Nativos Descripción boolean jboolean unsigned 8 bits byte jbyte signed 8 bits char jchar unsigned 16 bits short jshort signed 16 bits int jint signed 32 bits long jlong signed 64 bits float jfloat 32 bits double jdouble 64 bits void void N/A
  • 24. 25 Tipos de Referencias JNI jobject jclass jstring jarray jobjectArray jbooleanArray jbyteArray jcharArray jshortArray jintArray jlongArray jfloatArray jdoubleArray jthrowable Los elementos Arrays se manipulan usando Get<type>ArrayElements() and Get/Set<type>ArrayRegion() No olvides llamar ReleaseXXX() para cada llamado GetXXX()
  • 25. 26 Llamando métodos Java* En una instancia de objeto: jclass clazz = (*env)->GetObjectClass(env, obj); jmethodID mid = (*env)->GetMethodID(env, clazz, "methodName", "(…)…"); if (mid != NULL) (*env)->Call<Type>Method(env, obj, mid, parameters…); Llamado estático: jclass clazz = (*env)->FindClass(env, "java/lang/String"); jmethodID mid = (*env)->GetStaticMethodID(env, clazz, "methodName", "(…)…"); if (mid != NULL) (*env)->CallStatic<Type>Method(env, clazz, mid, parameters…); • (…)…: method signature • Parámetros: lista de parámetros esperados por el método Java* • <Type>: Java method return type
  • 26. 27 Lanzando excepciones Java* jclass clazz = (*env->FindClass(env, "java/lang/Exception"); if (clazz!=NULL) (*env)->ThrowNew(env, clazz, "Message"); La excepción será lanzada solo cuando la llamada JNI vuelve a Java*, no romperá la ejecución en curso de código nativo
  • 27. 28 Incluye todos los ABIs seteando APP_ABI a all en jni/Application.mk: APP_ABI=all El NDK generará código optimizado para todos los ABIs objetivo También puedes pasar la variable APP_ABI a ndk-build, y especificar cada ABI: ndk-build APP_ABI=x86 NDK: configurando los ABIs objetivos Build ARM v7a libs Build ARM v5 libs Build x86 libs Build mips libs
  • 28. 33 Debugging con logcat El NDK provee una API de API en <android/log.h>: Normalmente utilizado a través de este tipo de macro: #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "APPTAG", __VA_ARGS__)) Ejemplo de uso: LOGI("accelerometer: x=%f y=%f z=%f", x, y, z); int __android_log_print(int prio, const char *tag, const char *fmt, ...)
  • 29. 34 Debugging con logcat Para obtener más información en ejecución de código nativo: adb shell setprop debug.checkjni 1 (habilitado por defecto en el emulador) Y para obtener más información sobre depuración de memoria (solo root): adb shell setprop libc.debug.malloc 1 -> detección de pérdidas adb shell setprop libc.debug.malloc 10 -> Detección de overrun adb shell start/stop -> ambiente de reload
  • 30. 35 Debugging con GDB y Eclipse Soporte nativo debe ser agregado a tu proyecto Pasa NDK_DEBUG=1 APP_OPTIM=debug al commando ndk-build, desde las propiedades del proyecto: La bandera (flag) NDK_DEBUG debería ser automáticamente seteada para un build de debug pero no ocurre en este caso.
  • 31. 36 Debugging con GDB y Eclipse* Cuando NDK_DEBUG=1 es especificado, un archivo “gdbserver” se agrega a tus librerías
  • 32. 37 Debugging con GDB y Eclipse* Depura tu proyecto como una aplicación nativa Android*:
  • 33. 38 Debugging con GDB y Eclipse Desde la perspectiva de depuración de Eclipse tu puedes manipular breakpoints y depurar tu proyecto Tu aplicación correrá antes de que se adjunte el debugger, los breakpoints que establezcas cerca del lanzamiento de la app serán ignorados.
  • 34. 40 Flags GCC ffast-math influence round-off of fp arithmetic and so breaks strict IEEE compliance Las otras optimizaciones son completamente seguras Agrega -ftree-vectorizer-verbose para obtener un reporte de vectorización ifeq ($(TARGET_ARCH_ABI),x86) LOCAL_CFLAGS += -ffast-math -mtune=atom -msse3 -mfpmath=sse else LOCAL_CFLAGS += ... endif LOCAL_CFLAGS += -O3 -ffast-math -mtune=slm -msse4.2 -mfpmath=sse Para optimizar para la microarquitectura Intel Silvermont (disponible a partir de NDK r9 gcc-4.8 toolchain): Optimization Notice Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. Notice revision #20110804
  • 35. 41 Vectorización Las instrucciones SIMD hasta SSSE3 está disponible en arquitecturas basadas en el procesador Intel® Atom™, Intel® SSE4.2 en la microarquitectura Intel Silvermont En ARM*, puedes obtener vectorización a través de las instrucciones de ARM NEON* Dos formas clásicas de utilizer estas instrucciones: • Compilador de auto-vectorization • Intrínseco del compilador Optimization Notice Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. Notice revision #20110804 SSSE3, SSE4.2 Vector size: 128 bit Data types: • 8, 16, 32, 64 bit integer • 32 and 64 bit float VL: 2, 4, 8, 16 X2 Y2 X2◦Y2 X1 Y1 X1◦Y1 X4 Y4 X4◦Y4 X3 Y3 X3◦Y3 127 0