Reguły kompilacji Xcode

Większość typów projektów Xcode obsługuje reguły kompilacji, które pozwalają programistom na modyfikowanie sposobu tworzenia istniejących typów plików i definiowanie sposobu tworzenia nowych typów plików. Skrypty J2ObjC są celowo zaprojektowane pod kątem podłączania do systemów wbudowanych, takich jak Xcode.

Projekt j2objc-sample-reversi to przykład dodawania źródeł Java do prostej gry na iOS.

Minimalna kompilacja wymaga zaktualizowania ustawień kompilacji i dodania reguły kompilacji J2ObjC.

Aktualizowanie ustawień kompilacji

  1. Kliknij projekt w Nawigatorze projektów, aby otworzyć edytor projektów, i upewnij się, że jest wybrane miejsce docelowe aplikacji.
  2. Kliknij kartę Ustawienia kompilacji.
  3. Połącz bibliotekę emulacji JRE (jre_emul), dodając -ljre_emul do innych flag tagu łączącego. Powinno to wyglądać tak: Łączenie biblioteki emulacji JRE w Xcode
  4. Kliknij + i wybierz Dodaj ustawienie zdefiniowane przez użytkownika.
  5. Nazwij ustawienie J2OBJC_HOME, a jako jego wartość ustaw lokalizację J2ObjC. Powinien to być folder powstały w wyniku rozpakowania pakietu ZIP lub folder j2objc/dist, jeśli został skompilowany ze źródła, a katalog główny to j2objc.
  6. W sekcji Ścieżki wyszukiwania zmień te elementy:
    • Ścieżki wyszukiwania struktur dodaj: ${J2OBJC_HOME}/frameworks
    • Do ścieżek wyszukiwania w bibliotece dodaj ${J2OBJC_HOME}/lib (na potrzeby każdej konfiguracji kompilacji).
    • Ścieżki wyszukiwania nagłówków użytkowników dodaj ${J2OBJC_HOME}/include.
  7. Potwierdź ustawienia, wyszukując: J2OBJC_HOME. Zobaczysz tekst podobny do tego: Ustawienia kompilacji Xcode

Dodawanie reguły kompilacji J2ObjC

  1. Wskaż katalog główny plików źródłowych w języku Java. Nazwij go $source-root. Katalog główny to katalog zawierający najwyższy pakiet plików źródłowych.

    • Jeśli używasz git i chcesz pobrać pliki Javy z innego projektu git, możesz dodać moduł podrzędny śledzący projekt za pomocą źródeł Javy. Załóżmy na przykład, że Twój projekt Xcode (xcodeproj) znajduje się w języku ~/dev/MyProject, prawdopodobnie masz inny katalog MyProject ze źródłem Objective-C. W katalogu ~/dev/MyProject/MyProject uruchom polecenie git submodule add git@github.com:user/javaproject, aby utworzyć katalog ~/dev/MyProject/MyProject/javaproject ze źródłem projektu Java obok źródeł Objective-C. Następnie możesz przeciągnąć ten folder do projektu Xcode do grupy MyProject, która zawiera odbicie lustrzane Twojego systemu plików w Xcode. ${PROJECT_DIR}/MyProject/javaproject/src to $source-root.

    • Jeśli źródła Java znajdują się w grupie lub katalogu w projekcie Xcode, $source-root ma wartość ${PROJECT_DIR}/__group_or_directory_name__.

    • W razie wątpliwości kliknij prawym przyciskiem myszy grupę lub katalog i wybierz Pokaż w Finderze, aby wyświetlić katalog i użyć ścieżki bezwzględnej.

    • Jeśli na przykład masz pakiet Java foo.bar w katalogu o nazwie ~/myproject/src, pliki Java tego pakietu powinny znajdować się w ~/myproject/src/foo/bar/**.java – oznacza to, że ~/myproject/src jest katalogiem głównym Twojego projektu.

    • Jeśli pliki źródłowe Java są spoza projektu Xcode, w oknie terminala wpisz pełną ścieżkę użytą podczas wyświetlania ich.

  2. Kliknij projekt w Nawigatorze projektów, aby otworzyć edytor projektów, i upewnij się, że jest wybrane miejsce docelowe aplikacji.

  3. Kliknij kartę Reguły kompilacji.

  4. Kliknij +, aby dodać regułę kompilacji.

  5. W sekcji Proces w nowej regule wybierz „Pliki źródłowe Java”. W polu Użycie powinna być wybrana opcja „Skrypt niestandardowy:”.

  6. W polu tekstowym skryptu niestandardowego dodaj następujące informacje (pamiętaj o zastąpieniu $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. W panelu Pliki wyjściowe kliknij przycisk + i dodaj: ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h.

  8. Kliknij ponownie przycisk + i dodaj ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m.

Gdy skończysz, panel ustawień powinien wyglądać mniej więcej tak (uwaga: od wersji 10.2 Xcode nadal definiuje zmienną DERIVED_FILES_DIR tak samo jak DERIVED_FILE_DIR, aby zapewnić zgodność wsteczną):

Reguły kompilacji Xcode

Łączenie bibliotek dodatkowych

Etap kompilacji linku (faza „Link Binary With Libraries” w Xcode) wymaga flag specyficznych dla J2ObjC, które różnią się w zależności od tego, jak aplikacja używa przetłumaczonych klas Java. Pełną listę znajdziesz w artykule Wymagane ustawienia linków. Oto kilka przykładów, jakie dodatkowe biblioteki mogą być potrzebne:

  • Aby użyć pakietu java.util.zip, musisz połączyć bibliotekę libz.dylib, dodając -ljre_zip do innych flag tagu łączącego.
  • Aby generować bezpieczne hasze, musisz dodać do projektu platformę zabezpieczeń.

Debugowanie problemów z kompilacjami

Jeśli Xcode zgłosi błąd kompilacji za pomocą tych czynności, otwórz Issue Navigator i kliknij błąd, aby sprawdzić szczegóły. Spowoduje to wyświetlenie szczegółów instrukcji wiersza poleceń, która została wykonana. Oto kilka częstych błędów:

  • Nie można znaleźć klasy – najprawdopodobniej użyta wartość $source-path jest nieprawidłowa. Odszukaj opcję -sourcepath w wykonanym poleceniu i upewnij się, że wskazuje ona katalog główny plików źródłowych Javy.

  • Nie znaleziono pliku „JreEmulation.h” – najprawdopodobniej problem jest związany z nieprawidłową wartością ścieżek wyszukiwania nagłówków użytkownika. Wyszukaj w poleceniu kompilacji opcję -I ze ścieżką. Jeśli wygląda dobrze, skopiuj ścieżkę (nie -I) i w oknie terminala uruchom polecenie ls z tą ścieżką, aby sprawdzić, czy nie ma w niej literówki.

  • „_IOSClass_FromClass”, do którego odwołuje się: lub „_OBJCCLASS$_Java”ścieżki wyszukiwania w bibliotece są nieprawidłowe lub zapomniałeś połączyć bibliotekę emulacji JRE, ustawiając w polu Inne flagi tagu łączącego wartość -ljre_emul. Może też być konieczne połączenie dodatkowych bibliotek.

  • Niezdefiniowane symbole: _iconv* – link z wymaganej biblioteki iconv.

Jeśli nadal masz problemy, zadaj pytanie grupie dyskusyjnej j2objc.