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