Impostazioni link obbligatorie

Il passaggio di creazione del link (la fase di creazione "Collega binari con librerie " 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 dallo script della riga di comando j2objcc, ma devono essere specificati quando si crea con Xcode.

Librerie SDK

Questa libreria è richiesta dall'implementazione di J2ObjC di J2ObjC. La mancata inclusione di questa libreria comporterà errori di simboli non definiti con nomi che iniziano con _iconv.

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

Queste librerie sono utilizzate dall'implementazione JRE di J2ObjC e potrebbero dover essere collegate alla tua app.

RaccoltaFlag linkDescrizione
zip -l z Utilizzato da java.util.zip. Devi includere questo elemento se vuoi collegare jre_zip.
Sicurezza -framework per la sicurezza Obbligatorio se colleghi jre_security.

Percorso di ricerca libreria

La distribuzione di J2ObjC include diverse librerie statiche; per utilizzarle, il progetto deve indicare al linker dove trovarle.

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

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

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

Xcode: percorsi di ricerca delle librerie

Aggiorna i percorsi di ricerca della libreria del target dell'app aggiungendo _$(j2objcdistribution)/lib (di nuovo, utilizza il percorso reale).

Librerie JRE

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

Nota: la libreria libjre_core.a contiene classi della maggior parte delle librerie di altri sottoinsiemi. Il modo consigliato per ridurre le dimensioni dell'app è iniziare a collegarla con -l jre_core, quindi aggiungere le librerie di sottoinsiemi che risolvono gli eventuali simboli mancanti. Ad esempio, le classi 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 Il set minimo di classi richiesto per l'emulazione JRE di J2ObjC, a cui fa riferimento tutti i file di origine generati. Se le tue origini Java tradotte fanno riferimento al supporto di JRE per elementi come il networking, XML, SQL e così via, sarà necessario collegare anche le librerie aggiuntive (di seguito).
libjre_beans.a -l jre_beans Tutte le classi dal pacchetto java.beans. Non sono incluse tutte le classi Java Bean, poiché molte vengono utilizzate solo dalle app Swing e AWT.
libjre_channels.a -l jre_channels Diverse classi dei pacchetti java.nio.channels e java.nio.channels.spi.
libjre_concurrent.a -l jre_concurrent Diverse classi dei pacchetti java.util.concurrent, java.util.concurrent.atomic e java.util.concurrent.locks.
libjre_icu.a -l jre_icu Diverse classi da android.icu per supportare i fusi orari (principalmente per abilitare java.time).
libjre_io.a -l jre_io Diverse classi (meno utilizzate) dal pacchetto java.io.
libjre_net.a -l jre_net Diverse classi nel pacchetto java.net. Tuttavia, la classe java.net.URLClassLoader è in jre_security, mentre le classi javax.net e javax.net.ssl sono in jre_ssl.
libjre_security.a -l jre_security La maggior parte dei corsi nel pacchetto java.security (alcuni sono in jre_core), così come quelli nei pacchetti java.security.*, javax.crypto.* e javax.security.*. Se lo colleghi, dovrai collegare anche il framework di sicurezza di iOS. (vedi Librerie SDK)
libjre_sql.a -l jre_sql Tutte le classi 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 Tutte le classi nel pacchetto java.time.
libjre_util.a -l jre_util Diverse classi del pacchetto java.util, nonché del pacchetto java.util.logging. Tuttavia, la maggior parte delle classi java.util si trova in jre_core, quindi includi questa libreria solo se sono presenti errori relativi ai simboli JavaUtil* non risolti (i simboli JavaUtilConcurrent* si trovano nella libreria jre_concurrent).
libjre_xml.a -l jre_xml Tutte le classi dei pacchetti XML, tra cui javax.xml.*, org.w3c.dom.* e org.xml.sax.*.
libjre_zip.a -l jre_zip Tutte le classi dei pacchetti java.util.zip e java.util.jar. Se colleghi questo link, dovrai collegare anche la libreria ZIP dell'SDK. (consulta 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 è collegata a jre_emul, non è necessario includere nessuna delle altre librerie jre_* o il linker segnalerà errori di simboli duplicati. Questo perché jre_emul include tutte le classi definite in quelle altre librerie.

Altre librerie J2ObjC

Queste librerie Java e classi util di Android sono incluse nella distribuzione J2ObjC come librerie statiche:

RaccoltaFlag linkDescrizione
libguava.a -l guava Guava: librerie di base di Google per Java
libjavax_inject.a -l javax_inject La libreria di annotazioni per l'inserimento delle dipendenze JSR-330.
libjson.a -l json La libreria di interscambio dati JSON. Si tratta della versione Android di JSON, che differisce leggermente dalle altre implementazioni.
libjsr305.a -l jsr305 Annotazioni JSR-305 per la libreria di rilevamento di difetti del software.
libjunit.a -l giugno -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 runtime_protobuf Un runtime Google Protocol Buffer, ottimizzato per le app J2ObjC. Le app che utilizzano protobuf J2ObjC dovrebbero compilare i relativi file proto con j2objc_protoc.
libandroid_util.a -l android_util La libreria "android_util" contiene un piccolo sottoinsieme di classi di utilità dell'API Android. Non è destinato a fornire l'emulazione per un ambiente Android, ma solo un modo per condividere classi utili come "android.util.Log".

Il flag -ObjC viene spesso utilizzato per il collegamento di app per iOS, ma è necessario solo quando le classi e le categorie di Objective C devono essere caricate dinamicamente da librerie statiche. Con questo flag tutte le classi in tutte le librerie statiche collegate vengono incluse nell'app, indipendentemente dal fatto che vengano effettivamente utilizzate. Di conseguenza, consigliamo che le app che utilizzano J2ObjC si colleghino con il flag -ObjC solo quando le classi non vengono caricate in fase di runtime (un sintomo è quando viene generato JavaLangClassNotFoundException).

I framework di test JUnit e Mockito si basano fortemente sulla riflessione, pertanto le app di test che li utilizzano devono collegarsi a -ObjC.

Un'alternativa al collegamento in un'intera libreria statica per consentire di caricare dinamicamente alcune classi è fare riferimento a queste classi in modo statico. In Java, questo può essere fatto in un blocco di inizializzazione statico; ecco un esempio dalla classe IosSecurityProvider di 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
  };