Règles de compilation Xcode

La plupart des types de projets Xcode sont compatibles avec les règles de compilation, qui permettent aux développeurs de modifier la façon dont les types de fichiers existants sont créés et de définir la façon dont les nouveaux types de fichiers sont créés. Les scripts J2ObjC sont volontairement conçus pour se connecter à des systèmes de compilation tels que Xcode.

Le projet j2objc-sample-reversi montre comment ajouter des sources Java à un jeu iOS simple.

Une version minimale nécessite de mettre à jour les paramètres de compilation, puis d'ajouter une règle de compilation J2ObjC.

Mettre à jour les paramètres de compilation

  1. Cliquez sur le projet dans le navigateur de projets pour ouvrir l'éditeur de projet et assurez-vous que la cible de l'application est sélectionnée.
  2. Cliquez sur l'onglet Build Settings (Paramètres de compilation).
  3. Associez la bibliothèque d'émulation JRE (jre_emul) en ajoutant -ljre_emul à Other Linker Flags. Le résultat devrait se présenter comme suit : Associer la bibliothèque d'émulation JRE dans Xcode
  4. Cliquez sur +, puis sélectionnez Ajouter un paramètre défini par l'utilisateur.
  5. Nommez le paramètre J2OBJC_HOME et définissez sa valeur sur l'emplacement de J2ObjC. Il doit s'agir du dossier résultant de la décompression du fichier ZIP de la version ou du dossier j2objc/dist si vous avez compilé à partir de la source et que votre racine est j2objc.
  6. Sous Chemins de recherche, modifiez les éléments suivants :
    • Chemins de recherche de framework ajoute ${J2OBJC_HOME}/frameworks
    • Les chemins de recherche de bibliothèques ajoutent ${J2OBJC_HOME}/lib (pour chaque configuration de compilation).
    • Chemins de recherche d'en-tête utilisateur ajoute ${J2OBJC_HOME}/include.
  7. Confirmez vos paramètres en recherchant J2OBJC_HOME. Un résultat semblable aux lignes suivantes doit s'afficher : Paramètres de compilation Xcode

Ajouter une règle de compilation J2ObjC

  1. Déterminez le répertoire racine de vos fichiers sources Java, que nous appellerons $source-root. Le répertoire racine est le répertoire qui contient le premier package de vos fichiers sources.

    • Si vous utilisez git et souhaitez extraire vos fichiers Java d'un autre projet git, vous pouvez ajouter un sous-module qui suit le projet avec vos sources Java. Par exemple, supposons que votre projet Xcode (xcodeproj) se trouve dans ~/dev/MyProject. Vous disposez probablement d'un autre répertoire MyProject avec votre source Objectif-C. Dans le répertoire ~/dev/MyProject/MyProject, exécutez git submodule add git@github.com:user/javaproject pour créer un répertoire ~/dev/MyProject/MyProject/javaproject avec la source de votre projet Java, à côté de vos sources Goal-C. Vous pouvez ensuite faire glisser ce dossier dans votre projet Xcode sous le groupe MyProject, dans lequel Xcode duplique votre système de fichiers. ${PROJECT_DIR}/MyProject/javaproject/src correspond à $source-root.

    • Si vos sources Java se trouvent dans un groupe ou un répertoire de votre projet Xcode, $source-root est ${PROJECT_DIR}/__group_or_directory_name__.

    • En cas de doute, effectuez un clic droit sur ce groupe ou ce répertoire, puis sélectionnez Afficher dans le Finder pour afficher le répertoire et utiliser le chemin absolu.

    • Par exemple, si vous avez un package Java foo.bar dans un répertoire appelé ~/myproject/src, les fichiers Java de ce package doivent se trouver dans ~/myproject/src/foo/bar/**.java. Cela signifie que ~/myproject/src est le répertoire racine de votre projet.

    • Si les fichiers sources Java sont externes au projet Xcode, saisissez le chemin d'accès complet utilisé pour les répertorier dans une fenêtre de terminal.

  2. Cliquez sur le projet dans le navigateur de projets pour ouvrir l'éditeur de projet et assurez-vous que la cible de l'application est sélectionnée.

  3. Cliquez sur l'onglet Build Rules (Créer des règles).

  4. Cliquez sur le signe + pour ajouter une règle de compilation.

  5. Dans l'option Traiter de la nouvelle règle, sélectionnez "Fichiers sources Java". L'option Utilisation doit être "Script personnalisé".

  6. Dans la zone de texte du script personnalisé, ajoutez ce qui suit (n'oubliez pas de remplacer $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. Dans le panneau "Fichiers de sortie", cliquez sur le bouton +, puis ajoutez ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h.

  8. Cliquez à nouveau sur le bouton +, puis ajoutez ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m.

Lorsque vous avez terminé, le panneau des paramètres doit se présenter comme suit (remarque: à partir de la version 10.2, Xcode définit toujours la variable DERIVED_FILES_DIR de la même manière que DERIVED_FILE_DIR pour des raisons de rétrocompatibilité):

Règles de compilation Xcode

Associer des bibliothèques supplémentaires

L'étape de création des liens (phase de compilation "Link Binary With libraries" de Xcode) nécessite des indicateurs spécifiques à J2ObjC, qui varient en fonction de la manière dont votre application utilise les classes Java traduites. Pour obtenir la liste complète, consultez Paramètres de lien obligatoires. Voici quelques exemples de bibliothèques supplémentaires que vous devrez peut-être associer:

  • Pour utiliser le package java.util.zip, vous devez associer la bibliothèque libz.dylib en ajoutant -ljre_zip à vos Other Linker Flags.
  • Pour générer un hachage sécurisé, vous devez ajouter le framework de sécurité à votre projet.

Déboguer les problèmes de compilation

Si Xcode signale un échec de compilation en suivant ces étapes, ouvrez Issue Navigator, puis cliquez sur une erreur pour en examiner les détails. Vous verrez les détails de l'instruction de ligne de commande exécutée. Voici quelques erreurs courantes:

  • Impossible de résoudre le cours : il est fort probable que le code $source-path que vous avez utilisé soit incorrect. Recherchez l'option -sourcepath dans la commande exécutée et assurez-vous qu'elle pointe vers le répertoire racine de vos fichiers sources Java.

  • Fichier"JreEmulation.h" introuvable : le problème est probablement dû à une valeur incorrecte dans User Header Search Paths. Recherchez l'option -I avec le chemin d'accès dans la commande de compilation. Si tout semble correct, copiez le chemin d'accès (et non pas "-I") et, dans une fenêtre de terminal, exécutez ls avec ce chemin pour vérifier qu'il n'y a pas de faute de frappe.

  • "_IOSClass_FromClass", référencée à partir de : ou "_OBJCCLASS$_Java" : les chemins de recherche dans la bibliothèque sont incorrects ou vous avez oublié d'associer la bibliothèque d'émulation JRE en définissant Other Linker Flags sur -ljre_emul. Vous devrez peut-être également associer d'autres bibliothèques.

  • Symboles non définis : _iconv* : lien dans la bibliothèque iconv requise.

Si vous rencontrez toujours des problèmes, posez-les au groupe j2objc-discuss.