Reglas de compilación de Xcode

La mayoría de los tipos de proyectos de Xcode admiten reglas de compilación, que permiten a los desarrolladores modificar cómo se compilan los tipos de archivos existentes y definir cómo se compilan los tipos de archivos nuevos. Las secuencias de comandos de J2ObjC están diseñadas de forma intencional para conectarse a sistemas de compilación como Xcode.

El proyecto j2objc-sample-reversi es un ejemplo de cómo agregar fuentes de Java a un juego simple para iOS.

Una compilación mínima requiere actualizar la configuración de la compilación y, luego, agregar una regla de compilación J2ObjC.

Cómo actualizar la configuración de compilación

  1. Haz clic en el proyecto en el Navegador de proyectos para abrir el Editor de proyecto y asegúrate de que el destino de la aplicación esté seleccionado.
  2. Haz clic en la pestaña Build Settings.
  3. Vincula la biblioteca de emulación de JRE (jre_emul) agregando -ljre_emul a Otras marcas del vinculador. Se verá de la siguiente manera: Vinculación de la biblioteca de emulación de JRE en Xcode
  4. Haz clic en el signo + y selecciona Agregar parámetro de configuración definido por el usuario.
  5. Asigna el nombre J2OBJC_HOME al parámetro de configuración y establece su valor en la ubicación de J2ObjC. Debe ser la carpeta resultante de descomprimir el archivo ZIP de lanzamiento o la carpeta j2objc/dist si compilaste desde la fuente y tu raíz es j2objc.
  6. En Rutas de búsqueda, modifica lo siguiente:
    • Framework Search Paths agrega ${J2OBJC_HOME}/frameworks.
    • Las rutas de búsqueda de biblioteca agregan ${J2OBJC_HOME}/lib (para cada configuración de compilación).
    • En User Header Search Paths, se agrega ${J2OBJC_HOME}/include.
  7. Busca J2OBJC_HOME para confirmar la configuración. Deberías ver algo similar a lo siguiente: Configuración de la compilación de Xcode

Cómo agregar una regla de compilación de J2ObjC

  1. Determina el directorio raíz de tus archivos fuente Java, que llamaremos $source-root. El directorio raíz es el que contiene el paquete superior de los archivos fuente.

    • Si usas git y deseas extraer tus archivos Java de otro proyecto de Git, puedes agregar un submódulo que realice un seguimiento del proyecto con tus fuentes Java. Por ejemplo, supongamos que tu proyecto de Xcode (xcodeproj) está en ~/dev/MyProject, es probable que tengas otro directorio MyProject con tu fuente de Objective-C. En el directorio ~/dev/MyProject/MyProject, ejecuta git submodule add git@github.com:user/javaproject para crear un directorio ~/dev/MyProject/MyProject/javaproject con el código fuente de tu proyecto de Java junto a los orígenes de Objective-C. Luego, puedes arrastrar esa carpeta a tu proyecto de Xcode en el grupo MyProject, que tiene Xcode duplicará tu sistema de archivos. ${PROJECT_DIR}/MyProject/javaproject/src es la $source-root.

    • Si tus fuentes de Java están en un grupo o directorio de tu proyecto de Xcode, el $source-root es ${PROJECT_DIR}/__group_or_directory_name__.

    • Si tienes dudas, haz clic con el botón derecho en ese grupo o directorio y selecciona Mostrar en Finder para ver el directorio y usar la ruta de acceso absoluta.

    • Por ejemplo, si tienes un paquete de Java foo.bar en un directorio llamado ~/myproject/src, los archivos Java de ese paquete deben estar en ~/myproject/src/foo/bar/**.java, lo que significa que ~/myproject/src es el directorio raíz de tu proyecto.

    • Si los archivos fuente de Java son externos al proyecto de Xcode, ingresa la ruta de acceso completa que se usó cuando los enumeras en una ventana de la terminal.

  2. Haz clic en el proyecto en el Navegador de proyectos para abrir el Editor de proyecto y asegúrate de que el destino de la aplicación esté seleccionado.

  3. Haz clic en la pestaña Build Rules.

  4. Haz clic en + para agregar una regla de compilación.

  5. En la opción Process de la regla nueva, selecciona "Java source files". La opción Uso debe ser "Secuencia de comandos personalizada:".

  6. En el cuadro de texto de la secuencia de comandos personalizada, agrega lo siguiente (recuerda sustituir $source-root):

    if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi;
    "${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILE_DIR} -sourcepath "$source-root" --no-package-directories -g ${INPUT_FILE_PATH};
    
  7. En el panel Output Files, haz clic en el botón + y agrega ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h.

  8. Vuelve a hacer clic en el botón + y agrega ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m.

Cuando termines, el panel de configuración debería verse de la siguiente manera (ten en cuenta que, a partir de la versión 10.2, Xcode aún define la variable DERIVED_FILES_DIR de la misma manera que DERIVED_FILE_DIR para ofrecer retrocompatibilidad):

Reglas de compilación de Xcode

Vinculación de bibliotecas adicionales

El paso de compilación del vínculo (fase de compilación "Vincular objeto binario con bibliotecas" de Xcode) necesita marcas específicas de J2ObjC, que varían según cómo tu aplicación use las clases de Java traducidas. Para obtener una lista completa, consulta la Configuración de vinculaciones obligatoria. A continuación, se incluyen algunos ejemplos de las bibliotecas adicionales que podrías necesitar vincular:

  • Para usar el paquete java.util.zip, debes vincular la biblioteca libz.dylib agregando -ljre_zip a tus otras marcas del vinculador.
  • Para generar un hash seguro, debes agregar el marco de trabajo de seguridad a tu proyecto.

Cómo depurar problemas de compilación

Si Xcode informa un error de compilación con estos pasos, abre el Navegador de problemas y haz clic en un error para inspeccionar los detalles. Esto mostrará los detalles de qué declaración de línea de comandos se ejecutó. Estos son algunos errores comunes:

  • Class no se puede resolver: Lo más probable es que la $source-path que usaste sea incorrecta. Busca la opción -sourcepath en el comando ejecutado y asegúrate de que apunte al directorio raíz de tus archivos de origen Java.

  • No se encontró el archivo"JreEmulation.h": Lo más probable es que el problema sea un valor incorrecto de las rutas de búsqueda del encabezado del usuario. Busca la opción -I con la ruta de acceso en el comando de compilación. Si se ve bien, copia la ruta (no la -I) y, en una ventana de terminal, ejecuta ls con esa ruta para verificar que no haya un error tipográfico.

  • "_IOSClass_FromClass", hace referencia a: o "_OBJCCLASS$_Java": Las rutas de búsqueda en la biblioteca son incorrectas o te olvidaste de vincular la biblioteca de emulación JRE configurando Other Linker Flags en -ljre_emul. Es posible que también debas vincular otras bibliotecas.

  • Símbolos no definidos: _iconv*: Vínculo en la biblioteca iconv obligatoria.

Si todavía tienes problemas, pregúntale al grupo de j2objc-discuss.