desarrollo de aplicaciones realmente nativas con ndk
TRANSCRIPT
Distintas arquitecturas de Android apps
Apps nativas• Se programa en Java.
• Se invoca directamente las librerías y componentes del SDK de Android.
Apps HTML5 híbridas• Usa tecnologías web
(HTML5, CSS, Javascript).
• No se programa directo al SDK de Android sino hacia un framework intermedio (ej. Cordova).
¿Cuándo elegir cada una?
• Nativo
• Mejor desempeño y experiencia de usuario.
• Híbrido
• Mayor portabilidad.
Apps verdaderamente nativas (native^2)
• Código nativo (C, C++, ASM) compilado como librerías binarias que invocas desde tu app.
Native Development Kit (NDK)
• Conjunto de herramientas y build scripts que permiten incorporar código nativo (C/C++) en aplicaciones Android.
• Con NDK generas librerías binarias para cada arquitectura de procesador.
• Las librerías binarias se pueden invocar desde Java por medio de JNI (Java Native Interface).
#devday4w
¿Arquitectura de procesador?
• Android es soportado en una gran variedad de dispositivos con distintos tipos de arquitectura de procesador (ARM, ARM v7, x86, x86_64, MIPS).
• Los binarios compilados para una arquitectura de procesador no funcionan para otra arquitectura.
• Es necesario compilar binarios para cada arquitectura que desees soportar.
Flujo de Desarrollo con NDK
Código C/C++ Makefile ndk-build Mezclar con Java
GDB debug
Java Framework
SDK APIs
JNI
Librerías nativas
Aplicación Android*
NDK APIs
Librería Bionic C
Usando JNI
Arquitectura de aplicación 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 Header
Có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
#devday4w
Compatibilidad con C/C++ Standard
• Librería Bionic C:
• Más liviana que que la librería GNU C standard
• Soporte limitado de pthread.
• Acceso a las propiedades del sistema Android
• Bionic no es compatible a nivel binario con C standard
• Por ello hay que (re)compilar usando NDK.
#devday4w
Instalación de Android NDK• Descargar desde
https://developer.android.com/ndk/downloads
• Instalación incluye: • Herramientas y scripts para compilar. • Headers y librerías. • Documentación y ejemplos de código
Agregar manualmente código nativo a proyecto existente
Estructura típica de proyecto Carpeta JNI
1. Crear carpeta JNI para fuentes de código nativo.
2. Crear Makefile Android.mk
3. Construir librerías nativas usando el script NDK-BUILD
NDK-BUILD creará automáticamente las carpetas de
librerías ABI.
Consulta los ejemplos incluidos
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ódigo 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).
…
#devday4w
Integración de código nativo con Java
• En tu código Java, declara métodos nativos usando la palabra clave “nativa”:
public native String stringFromJNI();
• Proporciona la librería nativa compartida que contiene los métodos usados por tu aplicación y que construiste con NDK (ndk-build).
libMyLib.so
• Antes de usar la librería, debemos cargarla usando System.loadLibrary
static { System.loadLibrary("MyLib"); }
Integración de código nativo con Java
La función C que será mapeada: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"); }
#devday4w
Dos opciones para registrar las funciones desde C
a. JNI_OnLoad: En tu código C 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}, }
b. javah: Con la utilería javah genera encabezados (archivos .h) a partir de las clases java:
javah –d jni –classpath bin/classes com.example.hellojni.HelloJni
genera com_example_hellojni_HelloJni.h que contiene la definición:
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *, jobject);
MakefilesAndroid.mkmodule settings and declarations LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
Predefined macro can be:BUILD_SHARED_LIBRARY, BUILD_STATIC_LIBRARY,PREBUILT_SHARED_LIBRARY, PREBUILT_STATIC_LIBRARY Other useful variables:LOCAL_C_INCLUDES := ./headers/ LOCAL_EXPORT_C_INCLUDES := ./headers/ LOCAL_SHARED_LIBRARIES := module_shared LOCAL_STATIC_LIBRARIES := module_static
Application.mk Application-wide settingsAPP_PLATFORM := android-15 #~=minSDKVersion APP_CFLAGS := -O3 APP_STL := gnustl_shared #or other STL if you need extended C++ supportAPP_ABI := all #or all32, all64…APP_OPTIM := release #default NDK_TOOCLHAIN_VERSION := 4.8 #4.6 is default, 4.8 brings perfs, 4.9 also but less stable
Arquitecturas deseadas (ABI)
Incluye todos los ABIs indicando APP_ABI = all en jni/Application.mk: APP_ABI=all
El NDK generará código optimizado para todos los ABIs objetivoTambién puedes pasar la variable APP_ABI a ndk-build, y especificar cada ABI:
ndk-build APP_ABI=x86
librería para ARM v7a
librería para ARM v5librería para x86librería para mips
#devday4w
Intel INDE (Integrated Native Developer Experience)• Ambiente de desarrollo optimizado para
construir aplicaciones nativas.
• Se integra con IDEs populares (Android Studio, Visual Studio).
• Incluye librerías nativas para alto desempeño (procesamiento de gráficas, primitivas de cómputo paralelo).
• Facilita la creación y depuración de apps NDK.
https://software.intel.com/es-es/intel-inde
#devday4w
Soporte para NDK en Android Studio
• Android Studio todavía no tiene soporte directo de NDK.
• En Google IO 2015 se anunció que la próxima versión de Android Studio (1.3) tendrá soporte directo para NDK.
• Intel INDE aprovechará esta capacidad para brindar una experiencia todavía mejor para construir apps NDK.
#devday4w
Zona de Desarrolladores Intel en Español
• Visita http://software.intel.com/es-es/android para obtener:
• Herramientas gratuitas
• Artículos y guías
• Foros de discusión