Regole di compilazione Xcode

La maggior parte dei tipi di progetti Xcode supporta le regole di build, che consentono agli sviluppatori di modificare la modalità di creazione dei tipi di file esistenti e di definire le modalità di creazione di nuovi tipi di file. Gli script J2ObjC sono stati progettati intenzionalmente per essere utilizzati in sistemi di build come Xcode.

Il progetto j2objc-sample-reversi è un esempio di come aggiungere origini Java a un semplice gioco per iOS.

Una build minima richiede l'aggiornamento delle impostazioni della build e l'aggiunta di una regola di build J2ObjC.

Aggiorna le impostazioni di build

  1. Fai clic sul progetto nel Navigatore di progetto per aprire l'Editor di progetto e assicurati che sia selezionato il target dell'applicazione.
  2. Fai clic sulla scheda Impostazioni build.
  3. Collega la libreria di emulazione JRE (jre_emul) aggiungendo -ljre_emul ad Altri flag Linker. Dovrebbe avere il seguente aspetto: Collegamento della libreria di emulazione JRE in Xcode
  4. Fai clic sul segno + e seleziona Aggiungi impostazione definita dall'utente.
  5. Assegna all'impostazione il nome J2OBJC_HOME e imposta il valore sulla località di J2ObjC. Dovrebbe essere la cartella risultante dalla decompressione del file zip di rilascio o della cartella j2objc/dist se hai eseguito la compilazione dall'origine e la tua directory principale è j2objc.
  6. In Percorsi di ricerca, modifica quanto segue:
    • Aggiunta di ${J2OBJC_HOME}/frameworks per Percorsi di ricerca framework
    • I Percorsi di ricerca della libreria aggiungono ${J2OBJC_HOME}/lib (per ogni configurazione di build).
    • Percorsi di ricerca nelle intestazioni dell'utente aggiunge ${J2OBJC_HOME}/include.
  7. Conferma le impostazioni cercando J2OBJC_HOME. Dovresti vedere qualcosa di simile a questo: Impostazioni build Xcode

Aggiunta di una regola di build J2ObjC

  1. Determina la directory radice dei file di origine Java, che chiameremo $source-root. La directory principale è la directory che contiene il pacchetto principale dei file di origine.

    • Se utilizzi Git e vuoi estrarre i tuoi file Java da un altro progetto Git, puoi aggiungere un sottomodulo che monitora il progetto con le tue origini Java. Ad esempio, supponi che il tuo progetto Xcode (xcodeproj) si trovi in ~/dev/MyProject, quindi probabilmente hai un'altra directory MyProject con l'origine Objective-C. Nella directory ~/dev/MyProject/MyProject esegui git submodule add git@github.com:user/javaproject per creare una directory ~/dev/MyProject/MyProject/javaproject con origine per il tuo progetto Java, direttamente accanto alle origini Objective-C. Puoi quindi trascinare la cartella nel progetto Xcode, sotto il gruppo MyProject, che dispone del mirroring Xcode del file system. ${PROJECT_DIR}/MyProject/javaproject/src è $source-root.

    • Se le origini Java si trovano in un gruppo o in una directory nel progetto Xcode, $source-root è ${PROJECT_DIR}/__group_or_directory_name__.

    • In caso di dubbi, fai clic con il tasto destro del mouse sul gruppo o sulla directory e seleziona Mostra nel Finder per visualizzare la directory e utilizzare il percorso assoluto.

    • Ad esempio, se hai un pacchetto Java foo.bar in una directory denominata ~/myproject/src, i file Java del pacchetto dovrebbero trovarsi in ~/myproject/src/foo/bar/**.java, il che significa che ~/myproject/src è la directory principale del progetto.

    • Se i file di origine Java sono esterni al progetto Xcode, inserisci il percorso completo utilizzato quando li elenca in una finestra del terminale.

  2. Fai clic sul progetto nel Navigatore di progetto per aprire l'Editor di progetto e assicurati che sia selezionato il target dell'applicazione.

  3. Fai clic sulla scheda Regole di build.

  4. Fai clic sul segno + per aggiungere una regola di build.

  5. Per l'opzione Processo della nuova regola, seleziona "File di origine Java". L'opzione Utilizzo deve essere "Script personalizzato:".

  6. Nella casella di testo dello script personalizzato, aggiungi quanto segue (ricorda di sostituire $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. Nel riquadro File di output, fai clic sul pulsante + e aggiungi: ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h.

  8. Fai di nuovo clic sul pulsante + e aggiungi ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m.

Al termine, il riquadro delle impostazioni dovrebbe essere simile al seguente (nota: a partire dalla versione 10.2, Xcode definisce ancora la variabile DERIVED_FILES_DIR come DERIVED_FILE_DIR per garantire la compatibilità con le versioni precedenti):

Regole di build Xcode

Collegamento di librerie aggiuntive

Il passaggio di creazione del link (la fase di creazione "Collega binari con librerie " di Xcode) richiede flag specifici di J2ObjC, che variano a seconda di come l'applicazione utilizza le classi Java tradotte. Per un elenco completo, consulta le impostazioni di collegamento obbligatorie. Ecco un paio di esempi di librerie aggiuntive che potresti dover collegare:

  • Per utilizzare il pacchetto java.util.zip, devi collegare la libreria libz.dylib aggiungendo -ljre_zip agli Altri flag Linker.
  • Per generare hash in modo sicuro, devi aggiungere il framework di sicurezza al tuo progetto.

Debug dei problemi di build

Se Xcode segnala un errore di build seguendo questi passaggi, apri Issue Navigator e fai clic su un errore per esaminare i dettagli. Verranno mostrati i dettagli dell'istruzione a riga di comando che è stata eseguita. Di seguito sono riportati alcuni errori comuni:

  • Impossibile risolvere il corso - Molto probabilmente, il $source-path che hai utilizzato non è corretto. Cerca l'opzione -sourcepath nel comando eseguito e assicurati che punti alla directory radice dei file di origine Java.

  • File "JreEmulation.h" non trovato: molto probabilmente, il problema è dovuto a un valore User Header Search Paths (Percorsi di ricerca nelle intestazioni dell'utente) non valido. Cerca l'opzione -I con il percorso nel comando di creazione; se ti sembra corretto, copia il percorso (non -I) e in una finestra del terminale esegui ls con quel percorso per verificare che non sia presente un errore di battitura.

  • "_IOSClass_FromClass", a cui viene fatto riferimento da: o "_OBJCCLASS$_Java": i Percorsi di ricerca della libreria non sono corretti o hai dimenticato di collegare la libreria di emulazione JRE impostando Altri flag linker su -ljre_emul. Potrebbe essere necessario collegare anche librerie aggiuntive.

  • Simboli non definiti: _iconv*: link nella raccolta iconv obbligatoria.

Se i problemi persistono, rivolgiti al gruppo j2objc-Discussion.