Regras de criação do Xcode

A maioria dos tipos de projeto do Xcode oferece suporte a regras de build, que permitem que os desenvolvedores modifiquem a forma como os tipos de arquivo existentes são criados e definam como novos tipos são criados. Os scripts J2ObjC foram projetados intencionalmente para serem conectados a sistemas de compilação como o Xcode.

O projeto j2objc-sample-reversi é um exemplo de como adicionar origens Java a um jogo simples para iOS.

Um build mínimo requer a atualização das configurações e a adição de uma regra de build J2ObjC.

Atualizar as configurações do build

  1. Clique no projeto no Navegador do projeto para abrir o Editor do projeto e verificar se o destino do aplicativo está selecionado.
  2. Clique na guia Build Settings.
  3. Vincule a biblioteca de emulação JRE (jre_emul) adicionando -ljre_emul a Outras sinalizações do vinculador. Ele vai ter esta aparência: Como vincular a biblioteca de emulação JRE no Xcode
  4. Clique em + e selecione Adicionar configuração definida pelo usuário.
  5. Nomeie a configuração como J2OBJC_HOME e defina o valor como o local de J2ObjC. Ela precisa ser a pasta resultante da descompactação do zip da versão ou a pasta j2objc/dist, se você compilou da origem e sua raiz for j2objc.
  6. Em Caminhos de pesquisa, modifique o seguinte:
    • Os caminhos de pesquisa do framework adicionam ${J2OBJC_HOME}/frameworks
    • Os caminhos de pesquisa da biblioteca adicionam ${J2OBJC_HOME}/lib (para cada configuração do build).
    • Os caminhos de pesquisa de cabeçalho do usuário incluem ${J2OBJC_HOME}/include.
  7. Confirme suas configurações pesquisando por J2OBJC_HOME. Você vai ver algo parecido com isto: Configurações do build do Xcode

Como adicionar uma regra de compilação J2ObjC

  1. Determine o diretório raiz dos arquivos de origem Java, que chamaremos de $source-root. O diretório raiz é aquele que contém o pacote principal dos arquivos de origem.

    • Se você estiver usando o git e quiser extrair os arquivos Java de outro projeto git, poderá adicionar um submódulo acompanhando o projeto com as fontes Java. Por exemplo, suponha que seu projeto Xcode (xcodeproj) esteja em ~/dev/MyProject, então você provavelmente tem outro diretório MyProject com sua origem em Objective-C. No diretório ~/dev/MyProject/MyProject, execute git submodule add git@github.com:user/javaproject para criar um diretório ~/dev/MyProject/MyProject/javaproject com o código-fonte para seu projeto Java junto com as origens do Objective-C. Em seguida, você pode arrastar essa pasta para seu projeto Xcode no grupo MyProject, que tem o Xcode espelhado seu sistema de arquivos. ${PROJECT_DIR}/MyProject/javaproject/src é o $source-root.

    • Se as origens Java estiverem em um grupo ou diretório no projeto Xcode, $source-root será ${PROJECT_DIR}/__group_or_directory_name__.

    • Em caso de dúvida, clique com o botão direito do mouse nesse grupo ou diretório e selecione "Show in Finder" para ver o diretório e usar o caminho absoluto.

    • Por exemplo, se você tiver um pacote Java foo.bar em um diretório chamado ~/myproject/src, os arquivos Java desse pacote precisam estar em ~/myproject/src/foo/bar/**.java. Isso significa que ~/myproject/src é o diretório raiz do projeto.

    • Se os arquivos de origem Java forem externos ao projeto Xcode, insira o caminho completo usado ao listá-los em uma janela do Terminal.

  2. Clique no projeto no Navegador do projeto para abrir o Editor do projeto e verificar se o destino do aplicativo está selecionado.

  3. Clique na guia Build Rules.

  4. Clique em + para adicionar uma regra de criação.

  5. Para a opção Processar da nova regra, selecione "Java source files". A opção Usando deve ser "Script personalizado:".

  6. Na caixa de texto do script personalizado, adicione o seguinte (lembre-se de substituir $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. No painel "Arquivos de saída", clique no botão + e adicione: ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h.

  8. Clique no botão + novamente e adicione ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m.

Quando terminar, o painel de configurações ficará assim. Observação: a partir da versão 10.2, o Xcode ainda define a variável DERIVED_FILE_DIR da mesma forma que DERIVED_FILE_DIR para compatibilidade com versões anteriores:

Regras de build do Xcode

Vincular bibliotecas adicionais

A etapa de build do link (fase de build "Link Binary With Libraries" do Xcode) precisa de flags específicas de J2ObjC, que variam dependendo de como o app usa classes Java traduzidas. Para uma lista completa, consulte Configurações de link obrigatórias. Veja alguns exemplos de quais outras bibliotecas você pode precisar vincular:

  • Para usar o pacote java.util.zip, vincule a biblioteca libz.dylib adicionando -ljre_zip às Outras sinalizações do vinculador.
  • Para proteger a geração de hashes, adicione a estrutura de segurança ao seu projeto.

Como depurar problemas de build

Se o Xcode informar uma falha de build com essas etapas, abra o Issue Navigator e clique em um erro para inspecionar os detalhes. Isso mostrará os detalhes de qual instrução de linha de comando foi executada. Veja alguns erros comuns:

  • Class não pode ser resolvida: provavelmente, a $source-path que você usou estava incorreta. Procure a opção -sourcepath no comando executado e verifique se ela aponta para o diretório raiz dos arquivos de origem Java.

  • "JreEmulation.h" file not found: provavelmente, o problema é um valor inválido de User Header Search Paths. Pesquise no comando de build a opção -I com o caminho. Se estiver tudo certo, copie o caminho (não o -I) e, em uma janela de terminal, execute ls com esse caminho para verificar se não há um erro de digitação.

  • "_IOSClass_FromClass", reference from: ou "_OBJCCLASS$_Java": os Caminhos de pesquisa da biblioteca estão incorretos ou você se esqueceu de vincular a biblioteca de emulação JRE ao definir Outras sinalizações do vinculador como -ljre_emul. Talvez também seja necessário vincular outras bibliotecas.

  • Símbolos indefinidos: _iconv*: link na biblioteca iconv obrigatória.

Se ainda tiver problemas, pergunte ao grupo j2objc-discuss (em inglês).