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.
Mediathek | Link-Flag | Beschreibung |
---|---|---|
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.
Mediathek | Link-Flag | Beschreibung |
---|---|---|
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.
Mediathek | Link-Flag | Beschreibung |
---|---|---|
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:
Mediathek | Link-Flag | Beschreibung |
---|---|---|
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 Link-Flag -ObjC
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
};