Configuración de vínculos requerida

El paso de compilación del vínculo (fase de compilación "Vincular objeto binario con bibliotecas" de Xcode) necesita marcas específicas de J2ObjC, que varían según cómo tu aplicación use las clases de Java traducidas. Las marcas principales se establecen mediante la secuencia de comandos de línea de comandos j2objcc, pero se deben especificar cuando se compila con Xcode.

Bibliotecas de SDK

Esta biblioteca es obligatoria para la implementación de JRE de J2ObjC. Si no incluyes esta biblioteca, se generarán errores de símbolos indefinidos con nombres que comiencen con _iconv.

BibliotecaMarca de vínculoDescripción
iconv -l iconv jre_core lo usa para la codificación y decodificación de caracteres.

La implementación de JRE de J2ObjC usa estas bibliotecas, y es posible que debas vincularlas a tu app.

BibliotecaMarca de vínculoDescripción
zip -l z Lo usa java.util.zip. Debes incluir esto si vinculas jre_zip.
Seguridad seguridad del framework 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 indicarle al vinculador dónde encontrarlas.

Generalmente, la ruta de búsqueda de la biblioteca debe incluir _$(j2objcdistribution)/lib, donde la variable _$(j2objcdistribution) es la ruta a tu copia local de J2ObjC. Por ejemplo, si descomprimiste un archivo de actualización de J2ObjC en "/usr/local/", esta ruta sería "/usr/local/j2objc".

Importante: En realidad, no uses _$(j2objcdistribution) en tu proyecto; siempre especifica la ruta de acceso real donde instalaste J2ObjC.

Si compilas J2ObjC a partir de una copia de su código fuente, entonces _$(j2objcdistribution) es el directorio "j2objc/dist/" de tu copia. 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 la ruta real).

Bibliotecas JRE

Estas bibliotecas implementan clases definidas por la emulación JRE de J2ObjC.

Nota: La biblioteca libjre_core.a contiene clases de la mayoría de las otras bibliotecas de subconjuntos. La forma recomendada de reducir el tamaño de la app es comenzar a vincular la app con -l jre_core y, luego, agregar las bibliotecas de subconjuntos que resuelven cualquier símbolo faltante. Por ejemplo, las clases java.io más usadas 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 Corresponde al conjunto mínimo de clases que se requieren para la emulación de JRE de J2ObjC, al que se hace referencia en todos los archivos de origen generados. Si las fuentes de Java traducidas hacen referencia a la compatibilidad con JRE para elementos como herramientas de redes, XML, SQL, etc., también deberán vincularse las bibliotecas adicionales (a continuación).
libjre_beans.a -l jre_frijoles Todas las clases del paquete java.beans. No todas las clases de Java Beans están incluidas, ya que muchas solo las usan las apps Swing y AWT.
libjre_channels.a -l jre_canales Varias clases de los paquetes java.nio.channels y java.nio.channels.spi
libjre_concurrent.a -l jre_concurrente Varias clases de los paquetes 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 zonas horarias (principalmente para habilitar java.time).
libjre_io.a -l jre_io Varias clases (menos usadas) del paquete java.io
libjre_net.a -l jre_net Varias clases en el paquete java.net Sin embargo, la clase java.net.URLClassLoader está en jre_security, mientras que las clases javax.net y javax.net.ssl están en jre_ssl.
libjre_security.a -l jre_security La mayoría de las clases en el paquete java.security (algunas están en jre_core), así como las clases en los paquetes java.security.*, javax.crypto.* y javax.security.*. Si vinculas esto, también deberás vincular el framework de seguridad de iOS. (consulta Bibliotecas de SDK)
libjre_sql.a -l jre_sql Todas las clases del 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_hora Todas las clases del paquete java.time
libjre_util.a -l jre_util Varias clases del paquete java.util, así como el paquete java.util.logging. Sin embargo, la mayoría de las clases java.util están en jre_core, por lo que solo debes incluir esta biblioteca si hay errores de símbolos JavaUtil* sin resolver (los símbolos JavaUtilConcurrent* están en la biblioteca 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 JRE de J2ObjC. Si una app está vinculada con jre_emul, no se debe incluir ninguna de las otras bibliotecas jre_*, o 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 J2ObjC

Estas bibliotecas de Java y clases de utilidades de Android se incluyen en la distribución de J2ObjC como bibliotecas estáticas:

BibliotecaMarca de vínculoDescripción
libguava.a -l guayaba Guava: Bibliotecas principales de Google para Java
libjavax_inject.a -l javax_inject. Biblioteca de anotación de inserción de dependencias JSR-330.
libjson.a -l JSON La biblioteca de intercambio de datos JSON. Esta es la versión de JSON para Android, que difiere ligeramente de otras implementaciones.
libjsr305.a -l jsr305 Las anotaciones de JSR-305 para la biblioteca de detección de defectos de software
libjunit.a -l junit -ObjC El framework de prueba JUnit
libmockito.a -l simulato -ObjC Framework de simulación de Mockito para pruebas de unidades en Java.
libprotobuf_runtime.a -l protobuf_runtime Un entorno de ejecución de búfer de protocolo de Google, optimizado para apps de J2ObjC. Las apps que usan protobufs de J2ObjC deben compilar sus archivos proto con j2objc_protoc.
libandroid_util.a -l android_util La biblioteca `android_util` contiene un pequeño subconjunto de clases de utilidades de la API de Android. No pretende proporcionar emulación para un entorno de 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 necesaria cuando las clases y categorías de Objective C deben cargarse de forma dinámica desde bibliotecas estáticas. Esta marca hace que todas las clases en todas las bibliotecas estáticas vinculadas se incluyan en la app, sin importar si se usan o no. Por lo tanto, se recomienda que las apps que usan J2ObjC solo se vinculen con la marca -ObjC cuando las clases 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 vincularse con -ObjC.

Una alternativa a la vinculación en una biblioteca estática completa para que algunas clases se puedan cargar de forma dinámica es hacer referencia estática a esas clases. En Java, esto se puede hacer en un bloque de inicializador estático; aquí hay un ejemplo de la clase IosSecurityProvider de 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
  };