Erforderliche Linkeinstellungen

Für den Link-Build-Schritt (Build-Phase "Link Binary With Libraries" von Xcode) sind J2ObjC-spezifische Flags erforderlich. die abhängig davon variieren, wie Ihre Anwendung übersetzte Java-Klassen verwendet. Die wichtigsten Flags werden durch dem Befehlszeilenskript j2objcc, müssen aber bei der Erstellung mit Xcode.

SDK-Bibliotheken

Diese Bibliothek ist für die JRE-Implementierung von J2ObjC erforderlich. Wenn diese Angabe fehlt führt zu nicht definierten Symbolfehlern mit Namen, die mit _iconv beginnen.

BibliothekLink-FlagBeschreibung
iconv -L-Symbol Wird von jre_core für die Zeichencodierung und -decodierung verwendet.

Diese Bibliotheken werden von der JRE-Implementierung von J2ObjC verwendet und müssen möglicherweise mit Ihrer App verknüpft werden.

BibliothekLink-FlagBeschreibung
ZIP -l z Wird von java.util.zip. Geben Sie dies an, wenn Sie jre_zip verwenden.
Sicherheit -framework Sicherheit Erforderlich, wenn Sie jre_security verknüpfen.

Bibliothekssuchpfad

Die Distribution von J2ObjC umfasst mehrere statische Bibliotheken. um sie zu verwenden, muss Ihr Projekt wo sie zu finden sind.

Im Allgemeinen muss der Suchpfad der Bibliothek _$(j2objcdistribution)/lib enthalten, wobei der String _$(j2objcdistribution) ist der Pfad zu Ihrer lokalen Kopie von J2ObjC. Wenn Sie beispielsweise eine J2ObjC-Versionsarchivdatei entpackt und „/usr/local/“ ist, wäre dieser Pfad „/usr/local/j2objc“.

Wichtig: Verwenden Sie _$(j2objcdistribution) nicht in Ihrem Projekt. immer die Pfad, in dem Sie J2ObjC installiert haben.

Wenn Sie J2ObjC aus einer Kopie seines Quellcodes erstellen, dann ist _$(j2objcdistribution) die „j2objc/dist/“ -Verzeichnis. Dieses Verzeichnis existiert erst, wenn Sie J2ObjC mit make dist erstellt haben.

Xcode: Bibliothekssuchpfade

Aktualisieren Sie die Bibliothekssuchpfade des App-Ziels, indem Sie _$(j2objcdistribution)/lib hinzufügen. Verwenden Sie wieder tatsächlichen Pfad).

JRE-Bibliotheken

Diese Bibliotheken implementieren Klassen, die durch die JRE-Emulation von J2ObjC definiert werden.

Hinweis: Die Bibliothek libjre_core.a enthält Kurse aus den meisten anderen Teilmengen. Bibliotheken. Die empfohlene Methode zum Reduzieren der App-Größe besteht darin, die App zu verknüpfen mit -l jre_core und fügen Sie dann die Teilmengenbibliotheken hinzu, die alle fehlenden Symbole auflösen. Die am häufigsten verwendeten java.io-Klassen sind beispielsweise in libjre_core.a, Fügen Sie die libjre_io.a-Bibliothek daher nur ein, wenn es nicht behobene Symbolfehler gibt. deren Namen mit JavaIo beginnen.

BibliothekLink-FlagBeschreibung
libjre_core.a –l jre_core <ph type="x-smartling-placeholder"></ph> Die Mindestanzahl von Klassen erforderlich für die JRE-Emulation von J2ObjC, auf die alle Quelldateien erzeugt werden. Wenn Ihre übersetzten Java-Quellen auf JRE-Unterstützung verweisen für Dinge wie Netzwerke, XML, SQL usw., dann zusätzliche Bibliotheken (siehe unten) müssen ebenfalls verknüpft sein.
libjre_beans.a –l jre_beans <ph type="x-smartling-placeholder"></ph> Alle Kurse aus dem java.beans-Paket. Nicht alle Java Beans-Klassen sind da viele nur von Swing- und AWT-Apps verwendet werden.
libjre_channels.a –l jre_channels <ph type="x-smartling-placeholder"></ph> Mehrere Klassen aus java.nio.channels und java.nio.channels.spi Pakete.
libjre_concurrent.a -l jre_gleichzeitig <ph type="x-smartling-placeholder"></ph> Mehrere Klassen aus: java.util.concurrent, java.util.concurrent.atomic und java.util.concurrent.locks Pakete.
libjre_icu.a –l jre_icu <ph type="x-smartling-placeholder"></ph> Mehrere Klassen von android.icu in unterstützte Zeitzonen (hauptsächlich, um java.time.
libjre_io.a –l jre_io <ph type="x-smartling-placeholder"></ph> Mehrere (selten verwendete) Klassen aus dem java.io-Paket.
libjre_net.a –l jre_net <ph type="x-smartling-placeholder"></ph> Mehrere Klassen im java.net-Paket. Die java.net.URLClassLoader Klasse ist in jre_security, während die javax.net und javax.net.ssl Kurse finden in jre_ssl.
libjre_security.a –l jre_security <ph type="x-smartling-placeholder"></ph> Die meisten Kurse im java.security-Paket (einige befinden sich in jre_core), sowie die Klassen in java.security.*, javax.crypto.*- und javax.security.*-Pakete. In diesem Fall müssen Sie auch das iOS Security Framework verknüpfen. (siehe SDK-Bibliotheken)
libjre_sql.a –l jre_sql <ph type="x-smartling-placeholder"></ph> Alle Kurse im java.sql-Paket.
libjre_ssl.a -l jre_ssl <ph type="x-smartling-placeholder"></ph> Alle Kurse in den Paketen javax.net und javax.net.ssl.
libjre_time.a -l jre_time <ph type="x-smartling-placeholder"></ph> Alle Kurse im java.time-Paket.
libjre_util.a -l jre_util <ph type="x-smartling-placeholder"></ph> Mehrere Klassen aus dem java.util-Paket und der java.util.logging-Paket. Die meisten java.util Kurse befinden sich jedoch in jre_core. Nehmen Sie diese Bibliothek also nur auf, wenn es sind nicht behobene JavaUtil*-Symbolfehler (JavaUtilConcurrent*-Symbole befinden sich in der jre_concurrent.
libjre_xml.a -l jre_xml <ph type="x-smartling-placeholder"></ph> Alle Kurse aus den XML-bezogenen Paketen, darunter javax.xml.*, org.w3c.dom.* und org.xml.sax.*.
libjre_zip.a -l jre_zip <ph type="x-smartling-placeholder"></ph> Alle Kurse aus den Paketen java.util.zip und java.util.jar. Wenn Sie dies verknüpfen, müssen Sie auch die SDK-ZIP-Bibliothek verknüpfen. (siehe SDK-Bibliotheken)

libjre_emul.a (-l jre_emul)

Die jre_emul-Bibliothek enthält alle Klassen, die in der JRE-Emulation von J2ObjC enthalten sind. Wenn eine App mit jre_emul verknüpft ist, sollte keine der anderen jre_*-Bibliotheken enthalten sein. Andernfalls wird die Verknüpfung Doppelte Symbolfehler melden. Das liegt daran, dass jre_emul alle hier definierten Klassen einschließt. anderen Bibliotheken nutzen.

Andere J2ObjC-Bibliotheken

Diese Java-Bibliotheken und Android-Hilfsklassen sind in der J2ObjC-Datei enthalten. als statische Bibliotheken verwenden:

BibliothekLink-FlagBeschreibung
libguava.a -l Guave Guava: Google Core Libraries for Java
libjavax_inject.a -l javax_include Abhängigkeitsinjektion JSR-330 Anmerkungsbibliothek.
libjson.a -l JSON JSON-Datenaustauschbibliothek Dies ist die <ph type="x-smartling-placeholder"></ph> Android-Version von JSON, die sich geringfügig von anderen Implementierungen unterscheidet.
libjsr305.a -l JSr305 JSR-305-Annotationen für Software Fehlererkennungsbibliothek.
libjunit.a -l junit, ObjC Das JUnit-Test-Framework.
libmockito.a -l mockito -ObjC Das Mockito-Mocking-Framework für Unittests in Java
libprotobuf_runtime.a -l protobuf_runtime Google-Protokollzwischenspeicher für J2ObjC-Anwendungen optimiert. Apps, die J2ObjC-protobufs verwenden, sollten ihren Proto kompilieren mit j2objc_protoc.
libandroid_util.a -l android_util Die Bibliothek „android_util“ enthält eine kleine Teilmenge der Android API-Dienstprogrammklassen. Sie ist nicht dazu gedacht, eine Emulation für eine Android-Umgebung bereitzustellen, sondern nur, um Inhalte zu teilen nützliche Klassen wie „android.util.Log“.

Das Flag -ObjC wird häufig für die Verknüpfung von iOS-Apps verwendet, ist aber nur erforderlich, wenn Objective C-Klassen und -Kategorien müssen dynamisch aus statischen Bibliotheken geladen werden. Dieses Flag führt dazu, dass Klassen in allen verknüpften statischen Bibliotheken, die in die App aufgenommen werden sollen, unabhängig davon, ob sie tatsächlich verwendet. Daher wird empfohlen, Apps, die J2ObjC verwenden, nur dann eine Verknüpfung mit dem Flag -ObjC herzustellen, wenn Klassen werden während der Laufzeit nicht geladen (ein Symptom ist, wenn JavaLangClassNotFoundException ausgelöst wird).

Die JUnit- und Mockito-Test-Frameworks stützen sich stark auf Reflexion. mit -ObjC verknüpfen.

Eine Alternative zur Verlinkung in einer ganzen statischen Bibliothek, sodass einige Klassen dynamisch geladen werden können, ist um stattdessen statisch auf diese Klassen zu verweisen. In Java kann dies in einem statischen Initialisierer erfolgen. block; ist hier ein Beispiel aus der IosSecurityProvider-Klasse:

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