Правила сборки Xcode

Большинство типов проектов Xcode поддерживают правила сборки, которые позволяют разработчикам изменять способ построения существующих типов файлов и определять способ построения новых типов файлов. Сценарии J2ObjC специально разработаны для подключения к системам сборки, таким как Xcode.

Проект j2objc-sample-reversi — это пример того, как добавить исходники Java в простую игру для iOS.

Минимальная сборка требует обновления параметров сборки, а затем добавления правила сборки J2ObjC.

Обновите настройки сборки

  1. Щелкните проект в Навигаторе проектов , чтобы открыть Редактор проектов и убедиться, что выбрана цель приложения.
  2. Откройте вкладку «Настройки сборки» .
  3. Свяжите библиотеку эмуляции JRE ( jre_emul ), добавив -ljre_emul к другим флагам компоновщика . Это должно выглядеть так: Связывание библиотеки эмуляции JRE в Xcode
  4. Нажмите + и выберите «Добавить пользовательскую настройку» .
  5. Назовите параметр J2OBJC_HOME и установите его значение в местоположение J2ObjC. Это должна быть либо папка, полученная в результате распаковки zip-архива , либо папка j2objc/dist если вы скомпилировали из исходного кода и ваш корень — j2objc .
  6. В разделе «Пути поиска» измените следующее:
    • Пути поиска платформы добавляют ${J2OBJC_HOME}/frameworks
    • Пути поиска в библиотеке добавляют ${J2OBJC_HOME}/lib (для каждой конфигурации сборки).
    • Пути поиска в заголовке пользователя добавляют ${J2OBJC_HOME}/include .
  7. Подтвердите свои настройки, выполнив поиск J2OBJC_HOME . Вы должны увидеть что-то похожее на это:Настройки сборки Xcode

Добавление правила сборки J2ObjC

  1. Определите корневой каталог ваших исходных файлов Java, который мы назовем $source-root . Корневой каталог — это каталог, содержащий верхний пакет ваших исходных файлов.

    • Если вы используете git и хотите получить файлы Java из другого проекта git, вы можете добавить подмодуль , отслеживающий проект с помощью исходных кодов Java. Например, предположим, что ваш проект Xcode (xcodeproj) находится в ~/dev/MyProject , тогда у вас, вероятно, есть другой каталог MyProject с исходным кодом Objective-C. В каталоге ~/dev/MyProject/MyProject запустите git submodule add git@github.com:user/javaproject , чтобы создать каталог ~/dev/MyProject/MyProject/javaproject с исходным кодом для вашего проекта Java рядом с исходными кодами Objective-C. . Затем вы можете перетащить эту папку в свой проект Xcode в группу MyProject , в которой Xcode отражает вашу файловую систему. ${PROJECT_DIR}/MyProject/javaproject/src — это $source-root .

    • Если ваши исходные коды Java находятся в группе или каталоге вашего проекта Xcode, $source-root равен ${PROJECT_DIR}/__group_or_directory_name__ .

    • Если у вас есть сомнения, щелкните правой кнопкой мыши эту группу или каталог и выберите «Показать в Finder», чтобы просмотреть каталог и использовать абсолютный путь.

    • Например, если у вас есть пакет Java foo.bar в каталоге ~/myproject/src , файлы Java этого пакета должны находиться в ~/myproject/src/foo/bar/**.java — это означает ~/myproject/src — корневой каталог вашего проекта.

    • Если исходные файлы Java являются внешними по отношению к проекту Xcode, введите полный путь, используемый при их перечислении в окне терминала.

  2. Щелкните проект в Навигаторе проектов , чтобы открыть Редактор проектов и убедиться, что выбрана цель приложения.

  3. Откройте вкладку «Правила сборки» .

  4. Нажмите + , чтобы добавить правило сборки.

  5. Для параметра «Обработка» нового правила выберите «Исходные файлы Java». Параметр « Использование» должен быть «Пользовательский сценарий:».

  6. В текстовом поле пользовательского сценария добавьте следующее (не забудьте заменить $source-root ):

    if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi;
    "${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILE_DIR} -sourcepath "$source-root" --no-package-directories -g ${INPUT_FILE_PATH};
    
  7. На панели «Выходные файлы» нажмите кнопку «+» и добавьте: ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h .

  8. Нажмите кнопку + еще раз и добавьте ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m .

Когда вы закончите, панель настроек должна выглядеть примерно так (примечание: начиная с версии 10.2 Xcode по-прежнему определяет переменную DERIVED_FILES_DIR так же, как DERIVED_FILE_DIR, для обратной совместимости):

Правила сборки Xcode

Связывание дополнительных библиотек

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

  • Чтобы использовать пакет java.util.zip , вы должны связать библиотеку libz.dylib, добавив -ljre_zip к другим флагам компоновщика .
  • Чтобы выполнить безопасную генерацию хэша, вы должны добавить Security Framework в свой проект.

Отладка проблем сборки

Если Xcode сообщает об ошибке сборки при выполнении этих шагов, откройте Навигатор проблем и щелкните ошибку, чтобы просмотреть подробности. Это покажет подробную информацию о том, какой оператор командной строки был выполнен. Вот несколько распространенных ошибок:

  • Класс не может быть разрешен . Скорее всего, вы использовали неправильный $source-path . Найдите параметр -sourcepath в выполняемой команде и убедитесь, что он указывает на корневой каталог ваших исходных файлов Java.

  • Файл «JreEmulation.h» не найден . Скорее всего, проблема в неправильном значении путей поиска в заголовке пользователя . Найдите в команде сборки параметр -I с указанием пути; если все выглядит нормально, скопируйте путь (не -I) и в окне терминала запустите ls с этим путем, чтобы убедиться, что нет опечатки.

  • «_IOSClass_FromClass», ссылка на: или «_OBJC CLASS $_Java» — либо пути поиска библиотеки неверны, либо вы забыли связать библиотеку эмуляции JRE, установив для других флагов компоновщика значение -ljre_emul . Вам также может потребоваться подключить дополнительные библиотеки.

  • Неопределенные символы: _icv* — Ссылка на необходимую библиотеку iconv .

Если у вас по-прежнему возникают проблемы, обратитесь в группу j2objc-discuss .