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
- 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.
- Haz clic en la pestaña Build Settings.
- Vincula la biblioteca de emulación de JRE (
jre_emul
) agregando-ljre_emul
a Otras marcas del vinculador. Se verá de la siguiente manera: - Haz clic en el signo + y selecciona Agregar parámetro de configuración definido por el usuario.
- 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 carpetaj2objc/dist
si compilaste desde la fuente y tu raíz esj2objc
. - 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
.
- Framework Search Paths agrega
- Busca
J2OBJC_HOME
para confirmar la configuración. Deberías ver algo similar a lo siguiente:
Cómo agregar una regla de compilación de J2ObjC
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 directorioMyProject
con tu fuente de Objective-C. En el directorio~/dev/MyProject/MyProject
, ejecutagit 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 grupoMyProject
, 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.
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.
Haz clic en la pestaña Build Rules.
Haz clic en + para agregar una regla de compilación.
En la opción Process de la regla nueva, selecciona "Java source files". La opción Uso debe ser "Secuencia de comandos personalizada:".
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};
En el panel Output Files, haz clic en el botón + y agrega
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h
.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):
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, ejecutals
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.