Instalar el entorno de desarrollo de Cocos2dx en Linux para Android (Parte 2)

Hola de nuevo, si fuiste capaz de acabar la primera parte y aun tienes ánimos para seguir, aquí esta la segunda. En esta vamos a montar la app TestCpp de Cocos2dx para Android. Será mucho mas cortito que el anterior.

Pero primero vamos a hacer un debug del HelloCpp. No por nada, sino porque a mi en mi Debian me falla el debug XD. Recibo el siguiente error: Error while launching command: gdb –version. Y después de un rato me he percatado de que literalmente no tengo instalado, http://www.gnu.org/software/gdb/ y al parecer es necesario para hacer debug XD, tan fácil como:  sudo apt-get install gdb

Para compilar en Android lo primero es definir un par de variables de entorno dentro de nuestro Eclipse. La primera COCOS2DX la definimos en Eclipse->Preferences->General->Workspace->Linked Resources hacemos click en el botón New y apuntamos la variable al directorio raiz donde hemos descomprimido Cocos2dx.

La segunda variable que vamos a definir apunta a ruta donde hemos descomprimido nuestro NDK, NDK_ROOT y la vamos a definir en Eclipse->Preferences->C/C++->Build->Environment. Hacemos click en Add y especificamos como valor la carpeta donde descomprimimos el NDK.

Si como yo estáis compilando el proyecto TestCpp con la última versión de Android, puede que el NDK os de el siguiente error android-ndk-r8e/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml, este error lo podemos saltar modificando el fichero add-application.mk y en la linea 128 como se indica, cambiando $(call __ndk_warning por $(call __ndk_info.

Hecho esto, trata de compilar el proyecto TestCpp, obtendrás una salida por consola parecida a esta pero mucho mas larga :-).

Una vez terminado el proceso de compilación, arrancamos la app normalmente y todo debería funcionar correctamente.

SC20130717-214505

Gracias por aguantar hasta el final, en la nueva serie de post que voy a escribir, explicaré como montar un sistema de integración continua en general y para Android en particular.

¡Hasta pronto!

Instalar el entorno de desarrollo de Cocos2dx en Linux para Android (Parte 1)

Voy a explicar los pasos a seguir para instalar el entorno de desarrollo de Cocos2dx en Linux para trabajar con Eclipse y Android. Iremos desde lo básico hasta compilar y ejecutar los ejemplos HelloCpp en Linux y TestCpp en Android. Parto de que tienes conocimientos de Android, C++, Linux y tienes ya instalado un eclipse con Android configurado para trabajar. Por comodidad tengo incluido unos paths en mi .bashrc que utilizaré durante el tutorial, de esta forma por ejemplo puedo llamar al “adb” de Android desde cualquier terminal. Para añadirlos solo tenemos que situarnos en nuestro home y con nuestro editor favorito modificar el .bashrc nano .bashrc, y añadir las siguientes lineas:

Finalmente para hacerlo efectivo ejecutamos el comando source .bashrc Lo primero es instalar el plugin de Eclipse para C++, el Eclipse CDT, para ello tenemos dos formas, la primera buscarlo directamente en el Marketplace de eclipse Help > Eclipse Marketplace..”, la segunda utilizando el update site http://download.eclipse.org/tools/cdt/releases/juno. A continuación vamos a descargarnos la última versión de Cocos2dx de su página oficial (http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download), en nuestro caso la versión 2.1.4, y la última versión del NDK de Android (http://developer.android.com/tools/sdk/ndk/index.html), descomprimimos ambos ficheros en una carpeta a nuestra elección, en mi caso la carpeta “Programas”.

Ahora tenemos que definir una serie de variables de entorno editando nuevamente el fichero .bashrc de nuestro home nano .bashrc.

Nuevamente hacemos efectivos los cambios con source .bashrc Debéis estar seguros de tener instalados el JDK ya que sera necesario en los siguientes pasos. Si no lo tenéis instalado comprobad que versión de java tenéis con java -version, en mi caso tengo la 6, e instalar el JDK correspondiente, en mi caso sudo apt-get install openjdk-6-jdk.

Ahora empieza la parte divertida. Vamos instalar las dependencias necesarias para que Cocos2dx funcione, previamente si no lo habíamos instalado, debemos instalar el paquete de build essentials y el ia32-libs, consultar mi anterior post. Una vez hecho esto, lanzamos el script “make-all-linux-project.sh”, que se encuentra en la raiz de la carpeta de Cocos2dx que hemos descomprimido:  sudo bash make-all-linux-project.sh. Cuando el proceso haya finalizado, para saber si todo ha ido bien nos dirigimos a la carpeta “cocos2d-x-2.1.4/samples/Cpp/HelloCpp/proj.linux/bin/release” y ejecutamos el HelloCpp: ./HelloCpp. Si ves una ventana con el logo de Cocos2dx y el texto “Hello World” podemos continuar con el siguiente paso.

Ahora vamos a hacer que esto mismo funcione en eclipse para desarrollar más cómodamente. Para eso lo primero es importar el conjunto básico de proyectos necesarios para trabajar con Cocos2dx en Linux y Android, para ello sobre el Project Explorer de la perspectiva C/C++ de Eclipse, hacemos click derecho y seleccionamos la acción de “Import…” y en el desplegable seleccionamos “General > Existing Projects into Workspace”. Hacemos click en “Browse” y seleccionamos la carpeta raiz de Cocos2dx. Una vez que nos aparezca la lista completa hacemos click sobre “Deselect All” y de la lista seleccionamos solo los siguientes:

  • libBox2D – (proj.linux)
  • libChipmunk – (proj.linux)
  • libcocos2d – (proj.linux)
  • libcocos2dx – (android/java)
  • libCocosDenshion – (proj.linux)
  • libExtension . (proj.linux)
  • HelloCpp – (proj.linux)
  • TestCpp – (proj.android)

A priori parece una lista obvia, pero me llevo un buen rato averiguar exactamente cuales eran los  proyectos que me hacían falta la primera vez. Pero lo que resulto ser una perdida de tiempo fue mi desconocimiento del plugin CDT. Como tengo una distribución de Linux de 64bits, cuando compilaba por consola no tenia problemas, sin embargo en eclipse fallaba todo por culpa de las dependencias. Tras revisar los scripts que lanzaba el “make-all-linux-project.sh” y poner a mano todas las dependencias para que los proyectos compilasen, descubrí que cada proyecto de C++ tenía una configuración para 64 bits lista para ser utilizada dentro de Eclipse. Por ello los siguientes pasos solo tendréis que llevarlos a cabo si vuestro sistema operativo es de 64 bits. Adjunto imágenes.

Main Menu Home Logo

Vamos a ir compilando los proyectos en el mismo orden de la lista, y según vaya encontrando detalles los iré indicando.

  • Compilamos libBox2D sin problemas
  • Compilamos libChipmunk sin problemas
  • En la librería libcocos2d nos encontramos el primer problemilla, existe un error de dependencias con una librería estática, libxml2.a. Este problema se soluciona rápido, en las propiedades del proyecto C/C++ Build > Settings. De GCC C++ Compiler > Includes y de GCC C Compiler > Includes quitamos la dependencia con la libreria ../../../cocos2dx/platform/third_party/linux/libxml2. De GCC C++ Linker > Miscellaneous quitamos ../../../cocos2dx/platform/third_party/linux/libraries/lib64/libxml2.a. Ya he hecho un pull request al proyecto para subsanar el error https://github.com/cocos2d/cocos2d-x/pull/3019.
  • En la librería libCocosDenshion, ocurre algo curioso, después de arreglar todas las dependencias, al compilar en eclipse os saldrá una lista interminable de errores del tipo “…multiple definition of…” relacionados con las clases SimpleAudioEngineFMOD.cpp y SimpleAudioEngineOpenAL.cpp. Sin embargo, por consola funciona, así que analicé el Makefile y descubrí que en función de tus dependencias ya instaladas incluye uno u otro fichero a la hora de compilar. Supongo que existe una forma más elegante, pero no conozco lo suficiente el plugin CDT para hacer inclusiones condicionales, por lo que opte por borrar uno de los dos simplemente. Yo me quedé con SimpleAudioEngineFMOD.cpp, si decides quedarte con SimpleAudioEngineOpenAL.cpp y te pide algunas dependencias (en mi caso las pedía en Debian) debes instalar lo siguiente:
  • El proyecto libextension también nos dará problemillas. Llegados a este punto, reconozco que este problema es nuevo de esta ultima versión, la 2.1.4. Esta nueva entidad WebSocket no estaba antes y necesita de una dependencia que no existe “libwebsockets.h”.

    Fe de erratas (06/07/2013)
    <ERROR>
    Y de nuevo ¿por qué funciona con la consola?, pues está claro ¿no?, porque la entidad no está incluida como source en el Makefile :-). Por lo que vamos a borrar ambos WebSocket.h y WebSocket.cpp del “Project Explorer” de eclipse. </ERROR>
    Si que hay una forma de instalar la librería “libwebsockets” 🙂 y la razón por la que funciona por linea de comandos es porque no está en el Makefile. Para instalar la librería seguid los pasos que indico en este nuevo post , no lo pongo en este mismo post porque creo que ya es suficientemente grande :-).

    Pero aún así parece que no es suficiente :-), no encuentra SimpleAudioEngine.h, esta es fácil, conozco la respuesta, tan solo tenemos que acceder a las propiedades C/C++ Build > Settings y en la sección GCC C++ Compiler > Includes añadir ../../../CocosDenshion/include. He hecho el correspondiente pull request https://github.com/cocos2d/cocos2d-x/pull/3034

  • Y llegamos por fin al proyecto HelloCpp, y tras compilar recibimos el fallo:

    En este punto y dado que las otras versiones no me han provocado este error, tuve que investigar un rato. Después de más de una hora descubrí unas cuantas cosas. Primero, que esos dos elementos están definidos en ccFPSImages.h y ccFPSImages.c. Segundo, que por linea de comandos funciona, porque como ya supondréis esta incluido en el Makefile. Y tercero que en eclipse no va porque literalmente no se incluye en el .so que genera el proyecto libcocos2d. Esto se soluciona añadiendo estos dos elementos a la lista de “LinkedResources” en las properties del proyecto, dentro de la opcion “Resources”. Como no he descubierto como se hace con la interfaz de eclipse, directamente he editado el .project y he añadido la siguientes lineas dentro de la sección <linkedResources>. Aquí tenéis el link al pull request correspondiente: https://github.com/cocos2d/cocos2d-x/pull/3035

    Ahora sí es la buena, refrescamos, hacemos un clean y volvemos a compilar el proyecto libcocos2d, y hacemos el mismo proceso para el proyecto HelloCpp. Y si todo ha ido bien, y no estáis a punto de suicidaros, debería de ejecutarse una ventanita como esta:

Bueno creo que es suficiente para la primera parte 🙂 . En la segunda parte veremos como arrancar el proyecto TestCpp en un dispositivo Android. Muchas gracias por llegar hasta el final de este interminable post.