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
.
Biblioteca | Sinalização de link | Descriçã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.
Biblioteca | Sinalização de link | Descriçã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
.
Biblioteca | Sinalização de link | Descriçã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:
Biblioteca | Sinalização de link | Descriçã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". |
A sinalização de link -ObjC
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
};