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
.
Raccolta | Flag link | Descrizione |
---|---|---|
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.
Raccolta | Flag link | Descrizione |
---|---|---|
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
.
Raccolta | Flag link | Descrizione |
---|---|---|
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:
Raccolta | Flag link | Descrizione |
---|---|---|
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". |
Flag del link -ObjC
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
};