Configuración de vínculos requerida

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.

BibliotecaMarca de vínculoDescripció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.

BibliotecaMarca de vínculoDescripció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.

BibliotecaMarca de vínculoDescripció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:

BibliotecaMarca de vínculoDescripció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`.

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
  };