Обязательные настройки ссылки

На этапе построения ссылки (этап сборки Xcode «Связывание двоичных файлов с библиотеками») необходимы флаги, специфичные для J2ObjC, которые различаются в зависимости от того, как ваше приложение использует переведенные классы Java. Флаги ядра устанавливаются сценарием командной строки j2objcc , но их необходимо указать при сборке с помощью Xcode.

Библиотеки SDK

Эта библиотека требуется для реализации JRE J2ObjC. Если эта библиотека не будет включена, это приведет к неопределенным ошибкам символов с именами, начинающимися с _iconv .

Библиотека Флаг ссылки Описание
значок v -л значокв Используется jre_core для кодирования и декодирования символов.

Эти библиотеки используются реализацией JRE J2ObjC, и их, возможно, потребуется связать с вашим приложением.

Библиотека Флаг ссылки Описание
молния -лз Используется java.util.zip. Вам необходимо включить это, если вы связываете jre_zip .
Безопасность -фреймворк безопасности Требуется при связывании jre_security .

Путь поиска в библиотеке

В дистрибутив J2ObjC входит несколько статических библиотек; чтобы их использовать, ваш проект должен сообщить компоновщику, где их найти.

Как правило, путь поиска библиотеки должен включать _$(j2objc- дистрибутив)/lib , где переменная _$(j2objc -дистрибутив) — это путь к вашей локальной копии J2ObjC. Например, если вы разархивировали файл архива выпуска J2ObjC в «/usr/local/», этот путь будет «/usr/local/j2objc».

Важно : не используйте _$( дистрибутив j2objc) в своем проекте; всегда указывайте фактический путь, по которому вы установили J2ObjC.

Если вы собираете J2ObjC из копии его исходного кода, то _$( дистрибутив j2objc) — это каталог вашей копии «j2objc/dist/». Этот каталог не будет существовать, пока вы не соберете J2ObjC с помощью make dist .

Xcode: пути поиска в библиотеке

Обновите пути поиска библиотеки целевого приложения, добавив _$(j2objc distribution)/lib (опять же, используйте реальный путь).

Библиотеки JRE

Эти библиотеки реализуют классы, определенные с помощью эмуляции JRE J2ObjC.

Примечание. Библиотека libjre_core.a содержит классы из большинства других подмножеств библиотек. Рекомендуемый способ уменьшить размер приложения — начать связывать приложение с помощью -l jre_core , а затем добавить подмножества библиотек, которые устраняют все недостающие символы. Например, наиболее часто используемые классы java.io находятся в libjre_core.a , поэтому включайте библиотеку libjre_io.a только в том случае, если есть неразрешенные ошибки символов, имена которых начинаются с JavaIo .

Библиотека Флаг ссылки Описание
libjre_core.a -l jre_core Минимальный набор классов, необходимый для эмуляции JRE J2ObjC, на который ссылаются все сгенерированные исходные файлы. Если ваши переведенные источники Java ссылаются на поддержку JRE для таких вещей, как сеть, XML, SQL и т. д., тогда необходимо будет также связать дополнительные библиотеки (ниже).
libjre_beans.a -l jre_beans Все классы из пакета java.beans . Включены не все классы Java Beans, поскольку многие из них используются только приложениями Swing и AWT.
libjre_channels.a -l jre_channels Несколько классов из пакетов java.nio.channels и java.nio.channels.spi .
libjre_concurrent.a -l jre_concurrent Несколько классов из пакетов java.util.concurrent , java.util.concurrent.atomic и java.util.concurrent.locks .
libjre_icu.a -л jre_icu Несколько классов из android.icu для поддержки часовых поясов (в основном для включения java.time ).
libjre_io.a -l jre_io Несколько (менее часто используемых) классов из пакета java.io
libjre_net.a -l jre_net Несколько классов в пакете java.net . Однако класс java.net.URLClassLoader находится в jre_security , а классы javax.net и javax.net.ssl ​​— в jre_ssl .
libjre_security.a -l jre_security Большинство классов в пакете java.security (некоторые находятся в jre_core ), а также классы в пакетах java.security.* , javax.crypto.* и javax.security.* . Если вы свяжете это, вам также потребуется связать платформу безопасности iOS. (см. библиотеки SDK )
libjre_sql.a -l jre_sql Все классы в пакете java.sql .
libjre_ssl.a -l jre_ssl Все классы в пакетах javax.net и javax.net.ssl .
libjre_time.a -l jre_time Все классы в пакете java.time .
libjre_util.a -l jre_util Несколько классов из пакета java.util , а также пакета java.util.logging . Однако большинство классов java.util находятся в jre_core , поэтому включайте эту библиотеку только в том случае, если есть неразрешенные ошибки символов JavaUtil* (символы JavaUtilConcurrent* находятся в библиотеке jre_concurrent ).
libjre_xml.a -l jre_xml Все классы из пакетов, связанных с XML, включая javax.xml.* , org.w3c.dom.* и org.xml.sax.* .
libjre_zip.a -l jre_zip Все классы из пакетов java.util.zip и java.util.jar . Если вы свяжете это, вам также потребуется связать zip-библиотеку SDK. (см. библиотеки SDK )

libjre_emul.a ( -l jre_emul )

Библиотека jre_emul содержит все классы, включенные в эмуляцию JRE J2ObjC. Если приложение связано с jre_emul , ни одна из других библиотек jre_* не должна быть включена, иначе компоновщик сообщит об ошибках дублирования символов. Это потому, что jre_emul включает все классы, определенные в этих других библиотеках.

Другие библиотеки J2ObjC

Эти библиотеки Java и служебные классы Android включены в дистрибутив J2ObjC как статические библиотеки:

Библиотека Флаг ссылки Описание
libguava.a -л гуава Гуава: основные библиотеки Google для Java
libjavax_inject.a -l javax_inject Библиотека аннотаций внедрения зависимостей JSR-330 .
libjson.a -л json Библиотека обмена данными JSON . Это версия JSON для Android , которая немного отличается от других реализаций.
libjsr305.a -л jsr305 Аннотации JSR-305 для библиотеки обнаружения дефектов программного обеспечения.
libjunit.a -l юнит -ObjC Платформа тестирования JUnit .
libmockito.a -l мокито -ObjC Фреймворк Mockito для модульных тестов на Java.
libprotobuf_runtime.a -l protobuf_runtime Среда выполнения Google Protocol Buffer , оптимизированная для приложений J2ObjC. Приложения, использующие прототипы J2ObjC, должны скомпилировать свои файлы прототипов с помощью j2objc_protoc.
libandroid_util.a -l android_util Библиотека android_util содержит небольшое подмножество служебных классов Android API. Он не предназначен для эмуляции среды Android, а просто для обмена полезными классами, такими как android.util.Log.

Флаг -ObjC часто используется при связывании приложений iOS, но он необходим только тогда, когда классы и категории Objective C необходимо динамически загружать из статических библиотек. Этот флаг приводит к включению в приложение всех классов во всех связанных статических библиотеках, независимо от того, используются они на самом деле или нет. Поэтому рекомендуется, чтобы приложения, использующие J2ObjC, связывались с флагом -ObjC только тогда, когда классы не загружаются во время выполнения (одним из симптомов является возникновение JavaLangClassNotFoundException ).

Платформы тестирования JUnit и Mockito в значительной степени полагаются на отражение, поэтому тестовые приложения, которые их используют, должны связываться с -ObjC .

Альтернативой связыванию всей статической библиотеки с возможностью динамической загрузки нескольких классов является статическая ссылка на эти классы. В Java это можно сделать в статическом блоке инициализатора; вот пример из класса IosSecurityProvider 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
  };