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

На этапе построения ссылки (этап сборки 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
  };