Configurações de link necessárias

A etapa de criação do link (fase de criação "Link Binary With bibliotecas" do Xcode) precisa de flags específicas do J2ObjC, que variam dependendo de como o aplicativo usa classes Java traduzidas. As flags principais são definidas pela do script de linha de comando j2objcc, mas precisam ser especificados ao criar com o Xcode.

Bibliotecas de SDK

Essa biblioteca é obrigatória pela implementação do JRE do J2ObjC. Não incluir 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 do JRE do J2ObjC e podem precisar ser vinculadas ao seu app.

BibliotecaSinalização de linkDescrição
zip -l z Usada por java.util.zip. Você precisa incluir isso se estiver vinculando jre_zip.
Segurança -Segurança do framework Obrigatório ao vincular jre_security.

Caminho de pesquisa da biblioteca

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

Geralmente, o caminho de pesquisa da biblioteca precisa incluir _$(j2objcdistribution)/lib, onde o A variável _$(j2objcdistribution) é o caminho para sua cópia local do J2ObjC. Por exemplo, se você descompactou um arquivo de versão J2ObjC para "/usr/local/", esse caminho seria "/usr/local/j2objc".

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

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

Xcode: caminhos de pesquisa de 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 do outro subconjunto. bibliotecas. A forma recomendada de reduzir o tamanho do app é começar a vinculá-lo com -l jre_core e adicione as bibliotecas de subconjuntos que resolvem todos 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ária para a emulação do JRE do J2ObjC, referenciada por todos arquivos de origem gerados. Se as fontes Java traduzidas mencionarem o suporte ao JRE para assuntos como rede, XML, SQL etc., além de bibliotecas adicionais (abaixo) também precisam ser vinculados.
libjre_beans.a -l jre_beans Todas as turmas do pacote java.beans. Nem todas as classes Java Beans são incluídos, já que muitos são usados apenas por apps Swing e AWT.
libjre_channels.a -l jre_channels Várias classes do java.nio.channels e do java.nio.channels.spi pacotes.
libjre_concurrent.a -l jre_concurrent Várias classes do java.util.concurrent, java.util.concurrent.atomic e pacotes java.util.concurrent.locks.
libjre_icu.a -l jre_icu Várias classes de android.icu para oferecer suporte a fusos horários (principalmente para permitir java.time).
libjre_io.a -l jre_io Várias classes (usadas com menos frequência) 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 javax.net e As classes javax.net.ssl estão em jre_ssl.
libjre_security.a -l jre_security A maioria das turmas no pacote java.security (alguns estão em jre_core), assim como as classes no java.security.*, javax.crypto.* e javax.security.*. Se você vincular, também vai precisar vincular o framework de segurança do iOS. Consulte Bibliotecas do SDK.
libjre_sql.a -l jre_sql Todas as turmas no pacote java.sql.
libjre_ssl.a -l jre_ssl Todas as turmas nos pacotes javax.net e javax.net.ssl.
libjre_time.a -l jre_time Todas as turmas no pacote java.time.
libjre_util.a -l jre_util Várias classes do pacote java.util, bem como a java.util.logging. A maioria das turmas de java.util estão em jre_core, então só inclua essa biblioteca se houver são erros de símbolo JavaUtil* não resolvidos (JavaUtilConcurrent* símbolos estão no jre_concurrent).
libjre_xml.a -l jre_xml Todas as turmas dos pacotes relacionados a XML, incluindo javax.xml.*, org.w3c.dom.* e org.xml.sax.*.
libjre_zip.a -l jre_zip Todas as turmas dos pacotes java.util.zip e java.util.jar. Se fizer isso, você 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 do J2ObjC. Se um app é vinculado a jre_emul, nenhuma das outras bibliotecas jre_* deve ser incluída, ou o vinculador reportar erros de símbolos duplicados. Isso ocorre porque jre_emul inclui todas as classes definidas nas outras bibliotecas.

Outras bibliotecas J2ObjC

Essas bibliotecas Java e classes util do Android estão incluídas no pacote J2ObjC como bibliotecas estáticas:

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

O flag -ObjC é usado com frequência ao vincular apps iOS, mas é necessário apenas quando o Objective As classes e categorias C precisam ser carregadas dinamicamente a partir de bibliotecas estáticas. Essa sinalização faz com que todos classes em todas as bibliotecas estáticas vinculadas para serem incluídas no aplicativo, independentemente de serem ou não usados. Por isso, recomendamos que os apps que usam J2ObjC só sejam vinculados à flag -ObjC quando: não são carregadas durante a execução (um sintoma é quando JavaLangClassNotFoundException é gerado).

Os frameworks de teste JUnit e Mockito dependem muito de reflexão. Por isso, os apps de teste que os utilizam precisam vincule com -ObjC.

Uma alternativa à vinculação de uma biblioteca estática completa para que algumas classes possam ser carregadas dinamicamente é para se referir a essas classes de forma estática. Em Java, isso pode ser feito em um inicializador estático block; aqui está um exemplo de J2ObjC IosSecurityProvider:

  // 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
  };