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