Erforderliche Linkeinstellungen

Der Link-Build-Schritt (die Build-Phase "Link Binary With Libraries" von Xcode) benötigt J2ObjC-spezifische Flags, die davon abhängen, wie Ihre Anwendung übersetzte Java-Klassen verwendet. Die Kern-Flags werden vom Befehlszeilenskript j2objcc festgelegt, müssen aber bei der Erstellung mit Xcode angegeben werden.

SDK-Bibliotheken

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

MediathekLink-FlagBeschreibung
iconv -l-Symbolv 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.

MediathekLink-FlagBeschreibung
zip -l z Wird von java.util.zip verwendet. Sie müssen dies angeben, wenn Sie jre_zip verknüpfen.
Sicherheit -framework Sicherheit Erforderlich, wenn jre_security verknüpft wird.

Bibliothekssuchpfad

Die J2ObjC-Distribution enthält mehrere statische Bibliotheken. Damit Sie sie verwenden können, muss Ihr Projekt dem Verknüpfer mitteilen, wo sie zu finden sind.

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

Wichtig: Verwenden Sie _$(j2objcdistribution) nicht in Ihrem Projekt. Geben Sie immer den tatsächlichen Pfad an, unter dem Sie J2ObjC installiert haben.

Wenn Sie J2ObjC aus einer Kopie des Quellcodes erstellen, dann ist _$(j2objcdistribution) das Verzeichnis "j2objc/dist/" Ihrer Kopie. Dieses Verzeichnis ist erst vorhanden, wenn Sie J2ObjC mit make dist erstellen.

Xcode: Bibliothekssuchpfade

Aktualisieren Sie die Bibliothekssuchpfade des App-Ziels, indem Sie _$(j2objcdistribution)/lib hinzufügen (verwenden Sie auch hier den echten Pfad).

JRE-Bibliotheken

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

Hinweis: Die libjre_core.a-Bibliothek enthält Klassen aus den meisten anderen Teilmengenbibliotheken. Die empfohlene Methode zum Reduzieren der App-Größe besteht darin, die App mit -l jre_core zu verknüpfen und dann die Teilmengenbibliotheken hinzuzufügen, die fehlende Symbole auflösen. Die am häufigsten verwendeten java.io-Klassen befinden sich beispielsweise in libjre_core.a. Nehmen Sie daher nur die libjre_io.a-Bibliothek auf, wenn ungelöste Symbolfehler vorhanden sind, deren Namen mit JavaIo beginnen.

MediathekLink-FlagBeschreibung
libjre_core.a -l Jre_Core Der Mindestsatz von Klassen, die für die JRE-Emulation von J2ObjC erforderlich sind und von allen generierten Quelldateien referenziert werden. Wenn Ihre übersetzten Java-Quellen auf die JRE-Unterstützung für Dinge wie Netzwerke, XML, SQL usw. verweisen, müssen zusätzliche Bibliotheken (unten) verknüpft sein.
libjre_beans.a -l jre_beans Alle Klassen aus dem Paket java.beans. Es sind nicht alle Java-Beans-Klassen enthalten, da viele nur von Swing- und AWT-Anwendungen verwendet werden.
libjre_channels.a -l jre_channels Mehrere Klassen aus den Paketen java.nio.channels und java.nio.channels.spi.
libjre_concurrent.a -l jre_gleichzeitig Mehrere Klassen aus den Paketen java.util.concurrent, java.util.concurrent.atomic und java.util.concurrent.locks.
libjre_icu.a -l jre_icu Mehrere Klassen von android.icu zur Unterstützung von Zeitzonen (hauptsächlich zum Aktivieren von java.time).
libjre_io.a -l jre_io Mehrere (weniger häufig verwendete) Klassen aus dem Paket java.io.
libjre_net.a -l jre_net Mehrere Klassen im Paket java.net. Die Klasse java.net.URLClassLoader befindet sich jedoch in jre_security, die Klassen javax.net und javax.net.ssl jedoch in jre_ssl.
libjre_security.a -l jre_security Die meisten Klassen im Paket java.security (einige befinden sich im Paket jre_core) sowie die Klassen in den Paketen java.security.*, javax.crypto.* und javax.security.*. Wenn Sie diese Verknüpfung herstellen, müssen Sie auch das iOS-Sicherheitsframework verknüpfen. (siehe SDK-Bibliotheken)
libjre_sql.a -l jre_sql Alle Klassen im Paket java.sql.
libjre_ssl.a -l jre_ssl Alle Klassen in den Paketen javax.net und javax.net.ssl.
libjre_time.a -l jre_time Alle Klassen im Paket java.time.
libjre_util.a -l jre_util Mehrere Klassen aus dem Paket java.util sowie dem Paket java.util.logging. Die meisten java.util-Klassen befinden sich jedoch in jre_core. Fügen Sie diese Bibliothek jedoch nur ein, wenn nicht behobene JavaUtil*-Symbolfehler vorliegen (JavaUtilConcurrent*-Symbole befinden sich in der jre_concurrent-Bibliothek).
libjre_xml.a -l jre_xml Alle Klassen aus den XML-bezogenen Paketen, einschließlich javax.xml.*, org.w3c.dom.* und org.xml.sax.*.
libjre_zip.a -l jre_zip Alle Klassen aus den Paketen java.util.zip und java.util.jar. Wenn Sie sie 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 J2-Emulation von J2ObjC enthalten sind. Wenn eine Anwendung mit jre_emul verknüpft ist, sollte keine der anderen jre_*-Bibliotheken enthalten sein. Andernfalls meldet die Verknüpfung Fehler wegen doppelter Symbole. Das liegt daran, dass jre_emul alle in diesen anderen Bibliotheken definierten Klassen enthält.

Andere J2ObjC-Bibliotheken

Diese Java-Bibliotheken und Android-Dienstprogrammklassen sind als statische Bibliotheken in der J2ObjC-Distribution enthalten:

MediathekLink-FlagBeschreibung
libguava.a -l Guave Guava: Google Core Libraries for Java
libjavax_inject.a -l Javax_insert Die JSR-330-Annotationsbibliothek für die Abhängigkeitsinjektion.
libjson.a -l JSON Die JSON-Datenaustauschbibliothek. Dies ist die Android-Version von JSON, die sich geringfügig von anderen Implementierungen unterscheidet.
libjsr305.a -l jsr305 Die JSR-305-Annotationen für die Bibliothek zur Softwarefehlererkennung
libjunit.a -l junit -ObjC Das JUnit-Testframework.
libmockito.a -l mockito -ObjC Das Mockito-Mocking-Framework für Einheitentests in Java.
libprotobuf_runtime.a -l protobuf_runtime Eine für J2ObjC-Anwendungen optimierte Google Protocol Buffer-Laufzeit. Anwendungen, die J2ObjC-Protokollpuffer verwenden, sollten ihre Proto-Dateien mit j2objc_protoc kompilieren.
libandroid_util.a -l android_util Die Bibliothek „android_util“ enthält eine kleine Teilmenge der Android API-Dienstprogrammklassen. Es dient nicht der Emulation einer Android-Umgebung, sondern nur der Möglichkeit, nützliche Klassen wie „android.util.Log“ freizugeben.

Das Flag -ObjC wird häufig beim Verknüpfen von iOS-Apps verwendet. Es ist jedoch nur erforderlich, wenn Objective-C-Klassen und -Kategorien dynamisch aus statischen Bibliotheken geladen werden müssen. Dieses Flag sorgt dafür, dass alle Klassen in allen verknüpften statischen Bibliotheken in die Anwendung aufgenommen werden, unabhängig davon, ob sie tatsächlich verwendet werden oder nicht. Es wird daher empfohlen, bei Anwendungen, die J2ObjC verwenden, nur dann eine Verknüpfung mit dem -ObjC-Flag herzustellen, wenn Klassen während der Laufzeit nicht geladen werden. Ein Symptom ist, wenn JavaLangClassNotFoundException ausgegeben wird.

Die JUnit- und Mockito-Test-Frameworks stützen sich stark auf Reflexion. Testanwendungen, die sie verwenden, sollten daher mit -ObjC verknüpft sein.

Eine Alternative zum Verknüpfen in einer ganzen statischen Bibliothek, damit einige Klassen dynamisch geladen werden können, besteht darin, diese Klassen statisch zu verweisen. In Java ist dies in einem statischen Initialisierungsblock möglich. Hier ist ein Beispiel aus der Klasse IosSecurityProvider von 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
  };