Uso del NDK de Android para x86 con Eclipse y portación de una aplicación de ejemplo

Objetivo

El complemento de Android para Eclipse (ADT) ahora admite el desarrollo de aplicaciones basadas en el NDK. Puede autogenerar archivos de proyectos y compilación, y trozos de código, e integrarse al desarrollo de aplicaciones para Android (con la compilación de bibliotecas nativas, el copiado de bibliotecas a la carpeta de JNI correspondiente del proyecto, el empaquetamiento de la aplicación y la generación del APK final con código del NDK incluido). En este artículo veremos cómo configurar Eclipse para aprovechar esta propiedad y seguiremos los pasos de la portación de un ejemplo de aplicación del NDK.

Configuración del complemento ADT para Eclipse con el objetivo de usarlo en el NDK

Antes de poder usar esta nueva herramienta, debemos configurar el ADT para Eclipse de manera que apunte al lugar donde está instalado el NDK. En primer lugar, asegúrese de actualizar el complemento ADT en Eclipse para contar con la versión que incluya los últimos cambios y descargue el NDK más reciente de este sitio:

http://developer.android.com/tools/sdk/ndk/index.html

En Eclipse, abra Window->Preferences->Android->NDK. Escriba la ruta de instalación del NDK (aquí suponemos que ha descargado el NDK en c:\sw\android-ndk en Windows*), como se muestra en la imagen de abajo, y haga clic primero en Apply y después en OK.


Figura 1: Configuración del NDK en el complemento ADT de Android para Eclipse

Ahora debemos habilitar y activar en el ADT las herramientas relacionadas con el NDK. Abramos uno de los ejemplos de JNI del NDK y compilémoslo.

Abrimos la aplicación de ejemplo hello-jni en Eclipse y agregamos al proyecto compatibilidad con NDK build

Para compilar el ejemplo nativo de JNI del NDK en Eclipse, necesitamos que el ADT sepa que en este ejemplo se usa código nativo/NDK.

Primero importemos a Eclipse el ejemplo HelloJni. En Eclipse, abra File -> New -> Project -> Android -> Android Project desde Existing Code. En la pantalla siguiente, ingrese la ruta del proyecto de ejemplo hello-jni (disponible en la carpeta de instalación del NDK), marque la casilla “Copy projects into workspace” (copiar los proyectos al espacio de trabajo) y haga clic en Finish. Reemplace la ruta del directorio raíz con la ruta de HelloJni de su carpeta de instalación del NDK.


Figura 2: Importación del proyecto de ejemplo HelloJni en Eclipse

Como el NDK de Android x86 es compatible con Gingerbread* y versiones más nuevas de Android, actualicemos la configuración de SDK mínima y de destino en el manifiesto de la aplicación. En Eclipse, hay que abrir AndroidManifest.xml en HelloJni Sample; haga clic en “Uses SDK” en el editor de AndroidManifest y verifique que Min SDK esté establecido en 10 (API 10).


Figura 3: Editor del archivo de manifiesto en Eclipse

Ahora estamos listos para agregar compatibilidad con NDK build a este proyecto en Eclipse. En Eclipse, haga clic con el botón derecho en el proyecto hello-jni (com.example.hellojni.HelloJni) -> Android Tools -> Add Native Support -> clic en Finish.


Figura 4: Agregar compatibilidad con el NDK al proyecto en Eclipse

Esta acción actualiza la configuración del proyecto con valores relacionados con la compilación en el NDK. Cuando volvamos a compilar el proyecto, primero compilaremos el código del NDK, copiaremos las bibliotecas compiladas a las carpetas correspondientes y luego continuaremos con el proceso de compilación normal del APK.

Compilación y ejecución de la aplicación en el emulador

Compilemos la aplicación y ejecutémosla en el emulador de Android. Damos por hecho que ya se tiene el AVD x86 Gingerbread ejecutándose en un emulador de Android basado en HAXM.

En Eclipse, haga clic con el botón derecho en el proyecto hello-jni (com.example.hellojni.HelloJni) -> Run As -> Android Application. Eclipse debería volver a compilar automáticamente el proyecto e intentar implementar/ejecutar el APK en el emulador.

Pero cuando se ejecuta el emulador, vemos un mensaje de error debajo porque la configuración predeterminada del proyecto respecto del NDK no admite x86.


Figure 5: Running the sample app in Emulator

En Eclipse, se puede ver que el logcat muestra el error “couldn’t load hello-jni” (no se pudo cargar hello-jni).

Figura 6: El logcat indica falla en la carga de la biblioteca nativa

De manera predeterminada, NDK build no compila automáticamente para ABI x86. Deberemos crear un archivo de compilación “Application.mk” para especificar explícitamente nuestros destinos de compilación o pasar argumentos de línea de comandos al comando NDK build.

Portación de la aplicación para usar ABI x86 y archivos de compilación del NDK

Modifiquemos el proyecto para que admita ABI x86. En Eclipse, haga clic con el botón derecho en la carpeta “jni” del proyecto hello-jni, luego elija New -> File -> escriba “Application.mk” como nombre de archivo y haga clic en Finish.


Figura 7: Agregar un nuevo archivo de compilación del NDK “Application.mk” al proyecto de ejemplo

Agregue al archivo “Application.mk” la línea “APP_ABI := all”, como se muestra abajo, y guarde el archivo.

 
Figura 8: Modificación del archivo Application.mk para que sus arquitecturas de destino sean todas (“all”).

Compilación de la aplicación, comprobación de que compila la biblioteca x86 y prueba en el emulador de x86

Ahora, cuando volvamos a compilar la aplicación, se compilará para todas las ABI admitidas en el NDK. Haga clic con el botón derecho en el proyecto en Eclipse -> Run As -> Android Application. Eclipse invocará automáticamente a NDK build y generará todas las bibliotecas nativas. Es posible verificarlo en la carpeta de bibliotecas, como se muestra abajo.


Figura 9: El explorador de proyectos de Eclipse muestra las bibliotecas nativas generadas

Eclipse implementará la aplicación en el emulador. Esta vez deberíamos ver que la aplicación se ejecuta bien, como se muestra en la captura de pantalla:


Figura 10: Ejecución exitosa de la aplicación de ejemplo en el emulador de Android x86

Esperamos que con este artículo haya aprendido a configurar el ADT para Eclipse para desarrollar código del NDK y a usar el archivo de compilación del NDK “Application.mk” para compilar las ABI de destino necesarias.

Artículos y recursos relacionados:

Notices

INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT.

INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT.

Intel may make changes to specifications and product descriptions at any time, without notice. Designers must not rely on the absence or characteristics of any features or instructions marked "reserved" or "undefined." Intel reserves these for future definition and shall have no responsibility whatsoever for conflicts or incompatibilities arising from future changes to them. The information here is subject to change without notice. Do not finalize a design with this information.

The products described in this document may contain design defects or errors known as errata which may cause the product to deviate from published specifications. Current characterized errata are available on request.

Contact your local Intel sales office or your distributor to obtain the latest specifications and before placing your product order.

Copies of documents which have an order number and are referenced in this document, or other Intel literature, may be obtained by calling 1-800-548-4725, or go to: http://www.intel.com/design/literature.htm

Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors. Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations, and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products.

Any software source code reprinted in this document is furnished under a software license and may only be used or copied in accordance with the terms of that license.

Intel and the Intel logo are trademarks of Intel Corporation in the US and/or other countries.

Copyright © 2012 Intel Corporation. All rights reserved.

*Other names and brands may be claimed as the property of others.

Optimization Notice

Para obtener información más completa sobre las optimizaciones del compilador, consulte nuestro Aviso de optimización.