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