30
Introducción al Desarrollo de NDK apps Aurora Rodríguez #devday4w

Desarrollo de aplicaciones realmente nativas con NDK

Embed Size (px)

Citation preview

Introducción al Desarrollo de NDK apps

Aurora Rodríguez #devday4w

Agenda

• ¿Qué es una aplicación nativa?

• Introducción a NDK

• JNI

• Configuración de builds

Repaso:

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.

Pero la cosa no queda ahí …

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.

¿Por qué usar NDK

Desarrollo con NDK

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.

Agregar soporte para NDK desde Eclipse

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).

JNI

#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);

Configuración de build

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

Extras(anuncios y noticias)

#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

Preguntas