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