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
.
Biblioteca | Marca de vínculo | Descripció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.
Biblioteca | Marca de vínculo | Descripció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
.
Biblioteca | Marca de vínculo | Descripció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:
Biblioteca | Marca de vínculo | Descripció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`. |
El parámetro de vínculo -ObjC
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
};