Wymagane ustawienia linku

Etap kompilacji linku (etap kompilacji „Połącz plik binarny z bibliotekami” w Xcode) wymaga flag J2ObjC, które różnią się w zależności od tego, jak aplikacja wykorzystuje przetłumaczone klasy Java. Główne flagi są ustawiane przez skrypt wiersza poleceń j2objcc, ale trzeba go podać przy tworzeniu za pomocą Xcode.

Biblioteki SDK

Ta biblioteka jest wymagana przez wdrożenie środowiska JRE J2ObjC. Brak informacji spowoduje niezdefiniowane błędy symboli o nazwach zaczynających się od _iconv.

BibliotekaFlaga linkuOpis
iconv -l Konw. Używany przez jre_core do kodowania i dekodowania znaków.

Te biblioteki są używane przez implementację środowiska JRE J2ObjC i mogą wymagać połączenia z aplikacją.

BibliotekaFlaga linkuOpis
zip -l z Używany przez java.util.zip. Musisz go podać, jeśli łączysz jre_zip.
Bezpieczeństwo – Bezpieczeństwo platformy Wymagany w przypadku łączenia z serwerem jre_security.

Ścieżka wyszukiwania biblioteki

Dystrybucja J2ObjC obejmuje kilka bibliotek statycznych; aby można było ich używać, projekt musi tagu łączącego, gdzie można je znaleźć.

Ogólnie ścieżka wyszukiwania biblioteki musi zawierać element _$(j2objcdistribution)/lib, gdzie klucz Zmienna _$(j2objcdistribution) to ścieżka do lokalnej kopii J2ObjC. Jeśli na przykład rozpakował plik archiwum wersji J2ObjC do „/usr/local/”, ścieżka ma postać „/usr/local/j2objc”.

Ważne: nie używaj w projekcie metody _$(j2objcdistribution). zawsze określaj rzeczywista ścieżka, w której zainstalowano J2ObjC.

Jeśli skompilujesz J2ObjC na podstawie jego kodu źródłowego, _$(j2objcdistribution) będzie „j2objc/dist/” katalogu. Ten katalog nie będzie istnieć, dopóki nie skompilujesz J2ObjC za pomocą make dist.

Xcode: ścieżki wyszukiwania bibliotek

Zaktualizuj ścieżki wyszukiwania bibliotek w celu aplikacji, dodając _$(j2objcdistribution)/lib (ponownie użyj rzeczywistej ścieżki).

Biblioteki JRE

Te biblioteki implementują klasy zdefiniowane w emulacji środowiska JRE J2ObjC.

Uwaga: biblioteka libjre_core.a zawiera zajęcia z większości pozostałych podzbiorów. biblioteki. Zalecanym sposobem zmniejszenia rozmiaru aplikacji jest rozpoczęcie łączenia aplikacji za pomocą -l jre_core, a następnie dodaj biblioteki podzbioru, które rozwiązuje problemy z brakującymi symbolami. Na przykład najczęściej używane klasy java.io to libjre_core.a, dodaj więc bibliotekę libjre_io.a tylko wtedy, gdy wystąpią nieusunięte błędy symboli których nazwy zaczynają się od JavaIo.

BibliotekaFlaga linkuOpis
libjre_core.a -l jre_core Minimalny zestaw zajęć wymagane do emulacji środowiska JRE J2ObjC, do których odwołują się wszystkie wygenerowane pliki źródłowe. Jeśli przetłumaczone źródła w Javie odwołują się do obsługi środowiska JRE na potrzeby sieci, kodu XML, SQL itp., a następnie biblioteki dodatkowe (poniżej) muszą zostać połączone.
libjre_beans.a -l jre_beans Wszystkie zajęcia z pakietu java.beans. Nie wszystkie klasy fasoli Java są ponieważ wiele z nich jest używanych tylko przez aplikacje Swing i AWT.
libjre_channels.a -l jre_channels Kilka zajęć z: java.nio.channels i java.nio.channels.spi przesyłek.
libjre_concurrent.a –l jednocześnie Kilka zajęć od: java.util.concurrent, java.util.concurrent.atomic i java.util.concurrent.locks pakietów.
libjre_icu.a -l jre_icu Kilka zajęć od android.icu do obsługi stref czasowych (głównie w celu java.time).
libjre_io.a -l Jre_io Kilka (rzadziej używanych) klas z pakietu java.io.
libjre_net.a -l jre_net Kilka zajęć w pakiecie java.net. Jednak java.net.URLClassLoader zajęcia są w jre_security, a javax.net i javax.net.ssl zajęć jest dostępnych w: jre_ssl.
libjre_security.a -l jre_security Większość zajęć w pakiecie java.security (kilka z nich jest w jre_core), oraz zajęć na zajęciach java.security.*, Pakiety javax.crypto.* i javax.security.*. Jeśli to zrobisz, musisz też połączyć platformę zabezpieczeń iOS. (zobacz Biblioteki SDK)
libjre_sql.a -l jre_sql Wszystkie zajęcia w pakiecie java.sql.
libjre_ssl.a -l jre_ssl Wszystkie zajęcia w pakietach javax.net i javax.net.ssl.
libjre_time.a -l jre_time Wszystkie zajęcia w pakiecie java.time.
libjre_util.a -l jre_util, Kilka zajęć z pakietu java.util, a także Pakiet java.util.logging. Większość zajęć (java.util) są jednak w języku jre_core, więc uwzględniaj tę bibliotekę tylko wtedy, gdy to nienaprawione błędy symboli (JavaUtil*) (Symbole JavaUtilConcurrent* znajdują się w jre_concurrent biblioteka).
libjre_xml.a -l jre_xml Wszystkie zajęcia z pakietów związanych z XML, w tym z javax.xml.*, org.w3c.dom.* i org.xml.sax.*.
libjre_zip.a -l jre_zip Wszystkie zajęcia z pakietów java.util.zip i java.util.jar. Jeśli to zrobisz, musisz też połączyć bibliotekę ZIP z pakietem SDK. (zobacz biblioteki SDK)

libjre_emul.a (-l jre_emul)

Biblioteka jre_emul zawiera wszystkie klasy uwzględnione w emulacji środowiska JRE J2ObjC. Jeśli aplikacja jest połączone z jre_emul, nie należy uwzględniać żadnej innej biblioteki jre_* – w przeciwnym razie tag łączący zgłasza błędy związane z duplikatami symboli. Dzieje się tak, ponieważ jre_emul obejmuje wszystkie klasy zdefiniowane w tych z innych bibliotek.

Inne biblioteki J2ObjC

Te biblioteki Java i klasy Android util należą do zbioru J2ObjC w postaci bibliotek statycznych:

BibliotekaFlaga linkuOpis
libguava.a -l gujawa Gujawa: podstawowe biblioteki Google dla języka Java
libjavax_inject.a -l javax_inject Wstrzykiwanie zależności JSR-330 z biblioteką adnotacji.
libjson.a -l json Biblioteka wymiany danych JSON. To jest Wersja JSON na Androida, która różni się nieco od innych implementacji.
libjsr305.a -l jsr305 Adnotacje JSR-305 dotyczące oprogramowania w bibliotece wykrywania defektów.
libjunit.a -l junit -ObjC Platforma testowa JUnit.
libmockito.a -l Mokito -ObjC Platforma naśladująca Mockito do testów jednostkowych w Javie.
libprotobuf_runtime.a -l protobuf_runtime Buffer protokołów Google środowisko wykonawcze, zoptymalizowane pod kątem aplikacji J2ObjC. Aplikacje korzystające z protokołów J2ObjC powinny skompilować swoje proto pliki z funkcją j2objc_protoc.
libandroid_util.a -l android_util, Biblioteka `android_util` zawiera niewielki podzbiór klas narzędzi Android API. Nie jest to emulacja środowiska Androida, a tylko sposób udostępniania przydatnych klas, takich jak „android.util.Log”.

Flaga -ObjC jest często używana przy łączeniu aplikacji na iOS, ale jest wymagana tylko wtedy, gdy Klasy i kategorie C muszą być ładowane dynamicznie z bibliotek statycznych. Ta flaga powoduje, że wszystkie klas we wszystkich połączonych bibliotekach statycznych, które mają być uwzględnione w aplikacji, niezależnie od tego, czy są . Dlatego zalecamy, aby aplikacje, które używają J2ObjC, łączyły się tylko z flagą -ObjC, gdy klasy nie są wczytywane w czasie działania (jeden z objawów to zgłoszenie wywołania JavaLangClassNotFoundException).

platformy testowe JUnit i Mockito w dużej mierze polegają na refleksji, dlatego aplikacje testowe, które z nich korzystają, powinny połączenie z parametrem -ObjC.

Alternatywą dla tworzenia linków w całej bibliotece statycznej, która umożliwia dynamiczne ładowanie kilku klas, jest statycznie odwoływać się do tych klas. W Javie można to zrobić w inicjatorze statycznym block; oto przykład z biblioteki J2ObjC Klasa IosSecurityProvider:

  // 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
  };