Configurações de link necessárias

A etapa de build do link (fase de build "Link Binary With Libraries" do Xcode) precisa de flags específicas do J2ObjC, que variam dependendo de como o app usa classes Java traduzidas. As sinalizações principais são definidas pelo script de linha de comando j2objcc, mas precisam ser especificadas ao criar com o Xcode.

Bibliotecas de SDK

Essa biblioteca é obrigatória pela implementação JRE do J2ObjC. A não inclusão dessa biblioteca vai resultar em erros de símbolo indefinido, com nomes que começam com _iconv.

BibliotecaSinalização de linkDescrição
iconv -l iconv Usado por jre_core para codificação e decodificação de caracteres.

Essas bibliotecas são usadas pela implementação JRE do J2ObjC e podem precisar ser vinculadas ao seu app.

BibliotecaSinalização de linkDescrição
zip -l z Usado por java.util.zip. Você precisará incluir isso se estiver vinculando jre_zip.
Segurança -framework Segurança Obrigatório para vincular jre_security.

Caminho de pesquisa da biblioteca

A distribuição do J2ObjC inclui várias bibliotecas estáticas. Para usá-las, seu projeto precisa informar ao vinculador onde encontrá-las.

Geralmente, o caminho de pesquisa da biblioteca precisa incluir _$(j2objcdistribution)/lib, em que a variável _$(j2objcdistribution) é o caminho para sua cópia local de J2ObjC. Por exemplo, se você descompactou um arquivo de lançamento J2ObjC para "/usr/local/", esse caminho vai ser "/usr/local/j2objc".

Importante: não use _$(j2objcdistribution) no projeto. Sempre especifique o caminho real em que você instalou o J2ObjC.

Se você criar o J2ObjC a partir de uma cópia do código-fonte, _$(j2objcdistribution) será o diretório "j2objc/dist/" da sua cópia. Esse diretório não existirá até que você crie o J2ObjC com make dist.

Xcode: caminhos de pesquisa da biblioteca

Atualize os caminhos de pesquisa da biblioteca do destino do app adicionando _$(j2objcdistribution)/lib (novamente, use o caminho real).

Bibliotecas JRE

Essas bibliotecas implementam classes definidas pela emulação JRE do J2ObjC.

Observação:a biblioteca libjre_core.a contém classes da maioria das outras bibliotecas de subconjuntos. A maneira recomendada de reduzir o tamanho do app é começar a vincular o app ao -l jre_core e adicionar as bibliotecas de subconjuntos que resolvem os símbolos ausentes. Por exemplo, as classes java.io mais usadas estão em libjre_core.a. Portanto, só inclua a biblioteca libjre_io.a se houver erros de símbolo não resolvidos com nomes que começam com JavaIo.

BibliotecaSinalização de linkDescrição
libjre_core.a -l jre_core O conjunto mínimo de classes necessárias para a emulação JRE do J2ObjC, referenciada por todos os arquivos de origem gerados. Se as fontes Java traduzidas referenciarem o suporte ao JRE para elementos como rede, XML, SQL etc., outras bibliotecas (abaixo) também precisarão ser vinculadas.
libjre_beans.a -l jre_beans Todas as classes do pacote java.beans. Nem todas as classes Java Beans estão incluídas, já que muitas são usadas apenas por apps Swing e AWT.
libjre_channels.a -l jre_channels Várias classes dos pacotes java.nio.channels e java.nio.channels.spi.
libjre_concurrent.a -l jre_concurrent Várias classes dos pacotes java.util.concurrent, java.util.concurrent.atomic e java.util.concurrent.locks.
libjre_icu.a -l jre_icu Várias classes de android.icu para oferecer compatibilidade com fusos horários (principalmente para ativar java.time).
libjre_io.a -l jre_io Várias classes (menos usadas) do pacote java.io.
libjre_net.a -l jre_net Várias classes no pacote java.net. No entanto, a classe java.net.URLClassLoader está em jre_security, enquanto as classes javax.net e javax.net.ssl estão em jre_ssl.
libjre_security.a -l jre_security A maioria das classes no pacote java.security (algumas estão em jre_core), e as classes nos pacotes java.security.*, javax.crypto.* e javax.security.*. Se você vincular isso, também vai precisar vincular a estrutura de segurança do iOS. Consulte Bibliotecas do SDK.
libjre_sql.a -l jre_sql Todas as classes no pacote java.sql.
libjre_ssl.a -l jre_ssl Todas as classes nos pacotes javax.net e javax.net.ssl.
libjre_time.a -l jre_time Todas as classes no pacote java.time.
libjre_util.a -l jre_util Várias classes dos pacotes java.util e java.util.logging. No entanto, a maioria das classes java.util está em jre_core. Portanto, só inclua essa biblioteca se houver erros de símbolo JavaUtil* não resolvidos (os símbolos JavaUtilConcurrent* estão na biblioteca jre_concurrent).
libjre_xml.a -l jre_xml Todas as classes dos pacotes relacionados a XML, incluindo javax.xml.*, org.w3c.dom.* e org.xml.sax.*.
libjre_zip.a -l jre_zip Todas as classes dos pacotes java.util.zip e java.util.jar. Se você vincular isso, também vai precisar vincular a biblioteca ZIP do SDK. Consulte Bibliotecas do SDK.

libjre_emul.a (-l jre_emul).

A biblioteca jre_emul contém todas as classes incluídas na emulação JRE de J2ObjC. Se um app estiver vinculado a jre_emul, nenhuma das outras bibliotecas jre_* precisará ser incluída, ou o vinculador informará erros de símbolos duplicados. Isso ocorre porque jre_emul inclui todas as classes definidas nessas outras bibliotecas.

Outras bibliotecas J2ObjC

Estas bibliotecas Java e classes de utilitários do Android estão incluídas na distribuição J2ObjC como bibliotecas estáticas:

BibliotecaSinalização de linkDescrição
libguava.a -l goiaba Guava: Bibliotecas principais do Google para Java (link em inglês)
libjavax_inject.a -l javax_inject A biblioteca de anotações de injeção de dependência JSR-330.
libjson.a -l json A biblioteca de intercâmbio de dados JSON Esta é a versão Android do JSON, que é um pouco diferente de outras implementações.
libjsr305.a -l jsr305 As anotações JSR-305 para a biblioteca de detecção de defeitos de software.
libjunit.a -l junit -ObjC O framework de testes JUnit (em inglês).
libmockito.a -l mockito -ObjC O framework de simulação Mockito (em inglês) para testes de unidade em Java.
libprotobuf_runtime.a -l protobuf_runtime Um ambiente de execução do Google Protocol Buffer, otimizado para apps J2ObjC. Apps que usam protobufs J2ObjC precisam compilar os arquivos proto com j2objc_protoc.
libandroid_util.a -l android_util A biblioteca `android_util` contém um pequeno subconjunto das classes de utilitários da API do Android. O objetivo não é fornecer emulação para um ambiente Android, mas apenas uma maneira de compartilhar classes úteis, como "android.util.Log".

A sinalização -ObjC é usada com frequência ao vincular apps iOS, mas ela só é necessária quando as classes e categorias Objective-C precisam ser carregadas dinamicamente a partir de bibliotecas estáticas. Essa sinalização faz com que todas as classes em todas as bibliotecas estáticas vinculadas sejam incluídas no app, sejam elas usadas ou não. Portanto, é recomendável que os apps que usam J2ObjC só sejam vinculados à flag -ObjC quando as classes não forem carregadas durante a execução. Um sintoma ocorre quando JavaLangClassNotFoundException é gerado.

Os frameworks de teste do JUnit e do Mockito dependem muito da reflexão. Portanto, os apps de teste que os usam precisam ser vinculados a -ObjC.

Uma alternativa à vinculação em uma biblioteca estática para que algumas classes possam ser carregadas dinamicamente é referenciar essas classes estaticamente. Em Java, isso pode ser feito em um bloco de inicializador estático. Veja um exemplo da classe IosSecurityProvider do J2ObjC:

  // Reference all dynamically loaded classes, so they are linked into apps.
  @SuppressWarnings("unused")
  private static final Class<?>[] unused = {
    IosCertificateFactory.class,
    IosMD5MessageDigest.class,
    IosRSAKeyFactory.class,
    IosRSAKeyPairGenerator.class,
    IosRSASignature.class,
    IosSecureRandomImpl.class,
    IosSHAMessageDigest.class
  };