El paso de compilación de vínculos (fase de compilación “Vincular binario con bibliotecas” de Xcode) necesita indicadores específicos de J2ObjC. que varían según la manera en que tu aplicación use las clases de Java traducidas. Las marcas principales las establecen j2objcc, pero se debe especificar cuando se compila con Xcode.
Bibliotecas de SDK
Esta biblioteca es obligatoria por la implementación de JRE de J2ObjC. No se incluye
generará errores de símbolos no definidos con nombres que comiencen con _iconv
.
Biblioteca | Marca de vínculo | Descripción |
---|---|---|
iconv | -l iconv | jre_core lo usa para codificar y decodificar caracteres. |
La implementación de JRE de J2ObjC utiliza estas bibliotecas y es posible que deban vincularse a tu app.
Biblioteca | Marca de vínculo | Descripción |
---|---|---|
zip | -l z | Lo usa java.util.zip. Debes incluir esto si realizas la vinculación jre_zip. |
Seguridad | -Framework Seguridad | Es obligatorio si se vincula jre_security. |
Ruta de búsqueda de la biblioteca
La distribución de J2ObjC incluye varias bibliotecas estáticas; para usarlas, tu proyecto debe contar el vinculador dónde encontrarlos.
Generalmente, la ruta de búsqueda de la biblioteca debe incluir _$(j2objcdistribution)/lib, donde La variable _$(j2objcdistribution) es la ruta de acceso a tu copia local de J2ObjC. Por ejemplo, si descomprimiste un archivo de lanzamiento de J2ObjC en "/usr/local/", esta ruta de acceso sería "/usr/local/j2objc".
Importante: No uses _$(j2objcdistribution) en tu proyecto. especificar siempre ruta de acceso real en la que instalaste J2ObjC.
Si compilas J2ObjC a partir de una copia de su código fuente, _$(j2objcdistribution) es el
“j2objc/dist/” . Este directorio no existirá hasta que compiles J2ObjC con make dist
.
Xcode: Rutas de búsqueda de bibliotecas
Actualiza las rutas de búsqueda de la biblioteca de destino de la app agregando _$(j2objcdistribution)/lib (nuevamente, usa el camino real).
Bibliotecas JRE
Estas bibliotecas implementan clases definidas por la emulación de JRE de J2ObjC.
Nota: La biblioteca libjre_core.a
contiene clases de la mayoría del otro subconjunto.
bibliotecas. Para reducir el tamaño de la app, se recomienda vincularla con la app
con -l jre_core
y, luego, agrega las bibliotecas de subconjuntos que resuelven los símbolos faltantes.
Por ejemplo, las clases java.io
que más se usan están en libjre_core.a
,
por lo que solo debes incluir la biblioteca libjre_io.a
si hay errores de símbolos sin resolver.
cuyos nombres comienzan con JavaIo
.
Biblioteca | Marca de vínculo | Descripción |
---|---|---|
libjre_core.a | -l jre_core | El conjunto mínimo de clases necesaria para la emulación de JRE de J2ObjC, a la que hacen referencia todos archivos de origen generados. Si tus fuentes de Java traducidas hacen referencia a la compatibilidad con JRE para cosas como redes, XML, SQL, etc., y luego bibliotecas adicionales (más abajo) también tendrán que vincularse. |
libjre_beans.a | -l frijoles_jre |
Todas las clases
del paquete java.beans . No todas las clases de Java Beans son
ya que muchos solo se usan en apps de Swing y AWT.
|
libjre_channels.a | -l jre_canales |
Varias clases
de java.nio.channels y java.nio.channels.spi
paquetes.
|
libjre_concurrent.a | -l jre_concurrente |
Varias clases
desde java.util.concurrent , java.util.concurrent.atomic
y java.util.concurrent.locks .
|
libjre_icu.a | -l jre_icu |
Varias clases
de android.icu para admitir las zonas horarias (principalmente para habilitar
java.time ).
|
libjre_io.a | -l jre_io |
Varias clases (de uso menos frecuente)
del paquete java.io .
|
libjre_net.a | -l jre_net |
Varias clases
en el paquete java.net . Sin embargo, el elemento java.net.URLClassLoader
la clase está en jre_security , mientras que javax.net y
Las clases javax.net.ssl están en jre_ssl .
|
libjre_security.a | -l jre_seguridad |
La mayoría de las clases
en el paquete java.security (algunos están en jre_core ),
así como las clases en java.security.* ,
javax.crypto.* y javax.security.* .
Si vinculas esta opción, también deberás vincular el framework de seguridad de iOS.
(consulta Bibliotecas de SDK)
|
libjre_sql.a | -l jre_sql |
Todas las clases
en el paquete java.sql .
|
libjre_ssl.a | -l jre_ssl |
Todas las clases
en los paquetes javax.net y javax.net.ssl .
|
libjre_time.a | -l jre_time |
Todas las clases
en el paquete java.time .
|
libjre_util.a | -l jre_util |
Varias clases
del paquete java.util , así como del
java.util.logging . La mayoría de las java.util clases
están en jre_core , por lo que solo debes incluir esta biblioteca si
son errores de símbolo JavaUtil* sin resolver
(Los símbolos JavaUtilConcurrent* están en el
jre_concurrent ).
|
libjre_xml.a | -l jre_xml |
Todas las clases
de los paquetes relacionados con XML, incluidos javax.xml.* ,
org.w3c.dom.* y org.xml.sax.* .
|
libjre_zip.a | -l jre_zip |
Todas las clases
de los paquetes java.util.zip y java.util.jar .
Si vinculas esto, también deberás vincular la biblioteca ZIP del SDK. (consulta
Bibliotecas de SDK)
|
libjre_emul.a (-l jre_emul)
La biblioteca jre_emul
contiene todas las clases incluidas en la emulación de JRE de J2ObjC. Si una app es
vinculado con jre_emul
, no se debe incluir ninguna de las otras bibliotecas jre_*; de lo contrario, el vinculador
informar errores de símbolos duplicados. Esto se debe a que jre_emul
incluye todas las clases definidas en esas
otras bibliotecas.
Otras bibliotecas de J2ObjC
Estas bibliotecas de Java y clases de utilidades de Android se incluyen en el J2ObjC como bibliotecas estáticas:
Biblioteca | Marca de vínculo | Descripción |
---|---|---|
libguava.a | -l guayaba | Guava: Bibliotecas de Google Core para Java |
libjavax_inject.a | -l javax_inject | La inserción de dependencias JSR-330 biblioteca de anotaciones. |
libjson.a | -l JSON | La biblioteca de intercambio de datos JSON. Este es el Versión de Android de JSON, que difiere ligeramente de otras implementaciones |
libjsr305.a | -l jsr305 | Las anotaciones JSR-305 para software de detección de defectos. |
libjunit.a | -l junit -ObjC | Framework de prueba JUnit |
libmockito.a | -l simuladoito -ObjC | El framework de simulación de Mockito para pruebas de unidades en Java. |
libprotobuf_runtime.a | -l protobuf_runtime | Un búfer de protocolo de Google optimizado para aplicaciones J2ObjC. Las apps que usan protobufs J2ObjC deben compilar su proto. con j2objc_protoc. |
libandroid_util.a | -l android_util | La biblioteca `android_util` incluye un pequeño subconjunto de las clases de utilidades de la API de Android. No tiene como objetivo proporcionar emulación para un entorno Android, sino solo una forma de compartir clases útiles como `android.util.Log`. |
El parámetro -ObjC Link
La marca -ObjC se usa con frecuencia cuando se vinculan apps para iOS, pero solo es obligatoria cuando se
Las clases y categorías de C deben cargarse de forma dinámica desde las bibliotecas estáticas. Esta marca provoca
en todas las bibliotecas estáticas vinculadas para que se incluyan en la app, sin importar si están
que se usan. Por lo tanto, se recomienda que las apps que usan J2ObjC solo se vinculen con la marca -ObjC cuando
no se cargan durante el tiempo de ejecución (un síntoma es cuando se arroja JavaLangClassNotFoundException
).
Los frameworks de prueba de JUnit y Mockito dependen en gran medida de la reflexión, por lo que las apps de prueba que los usan deben vínculo con -ObjC.
Una alternativa a vincular una biblioteca estática completa para que algunas clases puedan cargarse de forma dinámica que, en cambio, hagan referencia estática a esas clases. En Java, esto se puede hacer en un inicializador estático block; Aquí tienes un ejemplo de la 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
};