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
- Clique no projeto no Navegador do projeto para abrir o Editor do projeto e verificar se o destino do aplicativo está selecionado.
- Clique na guia Build Settings.
- Vincule a biblioteca de emulação JRE (
jre_emul
) adicionando-ljre_emul
a Outras sinalizações do vinculador. Ele vai ter esta aparência: - Clique em + e selecione Adicionar configuração definida pelo usuário.
- 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 pastaj2objc/dist
, se você compilou da origem e sua raiz forj2objc
. - 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
.
- Os caminhos de pesquisa do framework adicionam
- Confirme suas configurações pesquisando por
J2OBJC_HOME
. Você vai ver algo parecido com isto:
Como adicionar uma regra de compilação J2ObjC
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órioMyProject
com sua origem em Objective-C. No diretório~/dev/MyProject/MyProject
, executegit 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 grupoMyProject
, 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.
Clique no projeto no Navegador do projeto para abrir o Editor do projeto e verificar se o destino do aplicativo está selecionado.
Clique na guia Build Rules.
Clique em + para adicionar uma regra de criação.
Para a opção Processar da nova regra, selecione "Java source files". A opção Usando deve ser "Script personalizado:".
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};
No painel "Arquivos de saída", clique no botão + e adicione:
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h
.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:
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, executels
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).