Impostazioni link obbligatorie

Il passaggio di creazione del link (fase di creazione "Link Binary With Libraries" di Xcode) richiede flag specifici per J2ObjC, che variano a seconda di come l'applicazione utilizza le classi Java tradotte. I flag principali sono impostati lo script a riga di comando j2objcc, che però deve essere specificato durante la creazione con Xcode.

Librerie SDK

Questa libreria è richiesta dall'implementazione di JRE di J2ObjC. Mancata inclusione causerà errori di simboli non definiti con i nomi che iniziano con _iconv.

RaccoltaFlag linkDescrizione
iconv -l iconv Utilizzato da jre_core per la codifica e la decodifica dei caratteri.

Queste librerie vengono utilizzate dall'implementazione di JRE di J2ObjC e potrebbero dover essere collegate all'app.

RaccoltaFlag linkDescrizione
zip -l z Utilizzato da java.util.zip. Devi includerlo se colleghi jre_zip.
Sicurezza -framework: sicurezza Obbligatorio se si collega jre_security.

Percorso di ricerca nella raccolta

La distribuzione di J2ObjC include varie librerie statiche; per utilizzarli, il tuo progetto deve il linker dove trovarli.

In genere, il percorso di ricerca della libreria deve includere _$(j2objcdistribution)/lib, dove il parametro La variabile _$(j2objcdistribution) è il percorso della tua copia locale di J2ObjC. Ad esempio, se hai decompresso un file di archivio delle release di J2ObjC in "/usr/local/", questo percorso sarà "/usr/local/j2objc".

Importante: non utilizzare effettivamente _$(j2objcdistribution) nel tuo progetto, specificare sempre percorso effettivo in cui hai installato J2ObjC.

Se crei J2ObjC da una copia del suo codice sorgente, _$(j2objcdistribution) è "j2objc/dist/" . Questa directory non esisterà finché non crei J2ObjC con make dist.

Xcode: percorsi di ricerca nelle librerie

Aggiorna i percorsi di ricerca nelle librerie dell'app target aggiungendo _$(j2objcdistribution)/lib (di nuovo, usa il percorso reale).

Librerie JRE

Queste librerie implementano classi definite dall'emulazione JRE di J2ObjC.

Nota: la libreria libjre_core.a contiene corsi della maggior parte dell'altro sottoinsieme librerie. Il modo consigliato per ridurre le dimensioni dell'app è iniziare a collegarla con -l jre_core, poi aggiungi le librerie dei sottoinsiemi che risolvono gli eventuali simboli mancanti. Ad esempio, i corsi java.io di uso più comune sono in libjre_core.a, quindi includi la libreria libjre_io.a solo se sono presenti errori di simboli non risolti i cui nomi iniziano con JavaIo.

RaccoltaFlag linkDescrizione
libjre_core.a -l jre_core L'insieme minimo di corsi richiesto per l'emulazione JRE di J2ObjC, a cui si fa riferimento generati automaticamente. Se le origini Java tradotte fanno riferimento al supporto JRE per elementi come networking, XML, SQL e così via, poi le librerie aggiuntive (di seguito) devono essere collegati.
libjre_beans.a -l_fagioli_jre Tutti i corsi del pacchetto java.beans. Non tutte le classi Java Beans poiché molte vengono utilizzate solo dalle app Swing e AWT.
libjre_channels.a -l jre_channels Diversi corsi da java.nio.channels e java.nio.channels.spi pacchetti.
libjre_concurrent.a -l jre_concurrent Diversi corsi da java.util.concurrent, java.util.concurrent.atomic e java.util.concurrent.locks pacchetti.
libjre_icu.a -l jre_icu Diversi corsi dalle ore android.icu per supportare i fusi orari (principalmente per abilitare java.time).
libjre_io.a -l jre_io Vari corsi (meno utilizzati) del pacchetto java.io.
libjre_net.a -l jre_net Diversi corsi nel pacchetto java.net. Tuttavia, java.net.URLClassLoader è in jre_security, mentre javax.net e javax.net.ssl corsi sono in jre_ssl.
libjre_security.a -l jre_security La maggior parte dei corsi nel pacchetto java.security (alcuni si trovano in jre_core), così come i corsi nella java.security.*, javax.crypto.* e javax.security.* pacchetti. Se lo colleghi, dovrai collegare anche il framework di sicurezza di iOS. (consulta Librerie SDK).
libjre_sql.a -l jre_sql Tutti i corsi nel pacchetto java.sql.
libjre_ssl.a -l jre_ssl Tutti i corsi nei pacchetti javax.net e javax.net.ssl.
libjre_time.a -l jre_time Tutti i corsi nel pacchetto java.time.
libjre_util.a -l jre_util Diversi corsi del pacchetto java.util, oltre a Pacchetto java.util.logging. Maggior numero di java.util corsi sono in jre_core, quindi includi questa libreria solo se Sono errori di simboli JavaUtil* non risolti (JavaUtilConcurrent* simboli sono compresi jre_concurrent nella raccolta.
libjre_xml.a -l jre_xml Tutti i corsi dai pacchetti correlati a XML, tra cui javax.xml.*, org.w3c.dom.* e org.xml.sax.*.
libjre_zip.a -l jre_zip Tutti i corsi dai pacchetti java.util.zip e java.util.jar. Se lo colleghi, dovrai collegare anche la libreria ZIP dell'SDK. (vedi Librerie SDK)

libjre_emul.a (-l jre_emul)

La libreria jre_emul contiene tutte le classi incluse nell'emulazione JRE di J2ObjC. Se un'app è collegate a jre_emul, nessuna delle altre librerie jre_* deve essere inclusa o il linker segnalare errori di simboli duplicati. Questo perché jre_emul include tutti i corsi definiti in altre librerie.

Altre biblioteche J2ObjC

Queste librerie Java e classi Android util sono incluse nel file J2ObjC di distribuzione sotto forma di librerie statiche:

RaccoltaFlag linkDescrizione
libguava.a -l guava Guava: librerie principali di Google per Java
libjavax_inject.a -l javax_inject Inserimento delle dipendenze JSR-330 di annotazioni.
libjson.a -l json La libreria di interscambio di dati JSON. Questo è il Versione Android di JSON, leggermente diversa da altre implementazioni.
libjsr305.a -l jsr305 Le annotazioni JSR-305 per il software nella libreria per il rilevamento dei difetti.
libjunit.a -l junit -ObjC Il framework di test JUnit.
libmockito.a -l mockito -ObjC Il framework di simulazione Mockito per i test delle unità in Java.
libprotobuf_runtime.a -l tempo di esecuzione protobuf Un buffer di protocollo Google runtime, ottimizzato per le app J2ObjC. Le app che utilizzano protobuf J2ObjC devono compilare il proprio proto j2objc_protoc.
libandroid_util.a -l android_util La libreria "android_util" contiene un piccolo sottoinsieme di classi di utilità API Android. Non è pensata per fornire emulazione per un ambiente Android, ma solo un modo per condividere utili come "android.util.Log".

Il flag -ObjC viene usato spesso quando colleghi app per iOS, ma è obbligatorio solo quando si utilizza l'obiettivo Le classi e le categorie C devono essere caricate dinamicamente da librerie statiche. Questo flag causa tutti i di tutte le librerie statiche collegate da includere nell'app, che siano effettivamente in uso. Di conseguenza, è consigliabile che le app che utilizzano J2ObjC si colleghino con il flag -ObjC soltanto quando delle classi non vengono caricate in fase di runtime (un sintomo è quando viene generato JavaLangClassNotFoundException).

I framework di test di JUnit e Mockito si basano fortemente sulla riflessione, quindi le app di test che li utilizzano dovrebbero collega con -ObjC.

Un'alternativa al collegamento in un'intera libreria statica in modo da poter caricare dinamicamente alcune classi è per fare riferimento in modo statico a quelle classi. In Java, questa operazione può essere eseguita in un inizializzatore statico block; Ecco un esempio tratto da Classe 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
  };