Die meisten Xcode-Projekttypen unterstützen Build-Regeln, mit denen Entwickler die Erstellung bestehender Dateitypen ändern und festlegen können, wie neue Dateitypen erstellt werden. Die J2ObjC-Skripte sind absichtlich so konzipiert, dass sie in Build-Systeme wie Xcode integriert werden können.
Das j2objc-sample-reversi-Projekt ist ein Beispiel für das Hinzufügen von Java-Quellen zu einem einfachen iOS-Spiel.
Bei einem minimalen Build müssen die Build-Einstellungen aktualisiert und dann eine J2ObjC-Build-Regel hinzugefügt werden.
Build-Einstellungen aktualisieren
- Klicken Sie in der Projektnavigation auf das Projekt, um den Projekteditor zu öffnen, und prüfen Sie, ob das Anwendungsziel ausgewählt ist.
- Klicken Sie auf den Tab Build Settings (Build-Einstellungen).
- Verknüpfen Sie die JRE-Emulationsbibliothek (
jre_emul
), indem Sie-ljre_emul
zu Other Linker Flags hinzufügen. Sie sollte so aussehen: - Klicken Sie auf + und wählen Sie Benutzerdefinierte Einstellung hinzufügen aus.
- Nennen Sie die Einstellung
J2OBJC_HOME
und legen Sie als Wert den Speicherort von J2ObjC fest. Dies sollte entweder der Ordner sein, der durch das Entpacken der Release-ZIP-Datei entsteht, oder der Ordnerj2objc/dist
, wenn Sie aus der Quelle kompiliert haben und Ihr Stammverzeichnisj2objc
ist. - Ändern Sie unter Suchpfade Folgendes:
- Für Framework-Suchpfade wird
${J2OBJC_HOME}/frameworks
hinzugefügt. - Bibliothekssuchpfade fügen
${J2OBJC_HOME}/lib
hinzu (für jede Build-Konfiguration). - Suchpfade in Nutzer-Header fügen
${J2OBJC_HOME}/include
hinzu.
- Für Framework-Suchpfade wird
- Bestätigen Sie Ihre Einstellungen, indem Sie nach
J2OBJC_HOME
suchen. Sie sollten in etwa Folgendes sehen:
J2ObjC-Build-Regel hinzufügen
Bestimmen Sie das Stammverzeichnis Ihrer Java-Quelldateien. Nennen Sie es
$source-root
. Das Stammverzeichnis ist das Verzeichnis, das das oberste Paket Ihrer Quelldateien enthält.Wenn Sie Git verwenden und Ihre Java-Dateien aus einem anderen Git-Projekt abrufen möchten, können Sie ein Submodul hinzufügen, das das Projekt mit Ihren Java-Quellen verfolgt. Wenn sich Ihr Xcode-Projekt (xcodeproj) beispielsweise in
~/dev/MyProject
befindet, haben Sie wahrscheinlich ein weiteresMyProject
-Verzeichnis mit Ihrer Objective-C-Quelle. Führen Sie im Verzeichnis~/dev/MyProject/MyProject
den Befehlgit submodule add git@github.com:user/javaproject
aus, um ein~/dev/MyProject/MyProject/javaproject
-Verzeichnis mit Quelle für Ihr Java-Projekt direkt neben Ihren Objective-C-Quellen zu erstellen. Anschließend können Sie diesen Ordner in Ihr Xcode-Projekt in die GruppeMyProject
ziehen, in der Xcode Ihr Dateisystem spiegelt.${PROJECT_DIR}/MyProject/javaproject/src
ist der$source-root
.Wenn sich Ihre Java-Quellen in einer Gruppe oder einem Verzeichnis in Ihrem Xcode-Projekt befinden, ist
$source-root
${PROJECT_DIR}/__group_or_directory_name__
.Im Zweifelsfall klicken Sie mit der rechten Maustaste auf diese Gruppe oder dieses Verzeichnis und wählen Sie „In Finder anzeigen“ aus, um das Verzeichnis zu sehen und den absoluten Pfad zu verwenden.
Wenn sich beispielsweise das Java-Paket
foo.bar
in einem Verzeichnis namens~/myproject/src
befindet, sollten sich die Java-Dateien dieses Pakets in~/myproject/src/foo/bar/**.java
befinden. Das bedeutet, dass~/myproject/src
das Stammverzeichnis für Ihr Projekt ist.Wenn sich die Java-Quelldateien außerhalb des Xcode-Projekts befinden, geben Sie den vollständigen Pfad ein, der beim Auflisten in einem Terminalfenster verwendet wird.
Klicken Sie in der Projektnavigation auf das Projekt, um den Projekteditor zu öffnen, und prüfen Sie, ob das Anwendungsziel ausgewählt ist.
Klicken Sie auf den Tab Build-Regeln.
Klicken Sie auf +, um eine Build-Regel hinzuzufügen.
Wählen Sie für die Option Prozess der neuen Regel die Option „Java-Quelldateien“ aus. Unter Verwendung sollte „Benutzerdefiniertes Skript:“ ausgewählt sein.
Fügen Sie im Textfeld des benutzerdefinierten Skripts Folgendes hinzu (vergessen Sie nicht,
$source-root
zu ersetzen):if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi; "${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILE_DIR} -sourcepath "$source-root" --no-package-directories -g ${INPUT_FILE_PATH};
Klicken Sie im Bereich „Ausgabedateien“ auf die Schaltfläche + und fügen Sie Folgendes hinzu:
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h
.Klicken Sie noch einmal auf die Schaltfläche + und fügen Sie
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m
hinzu.
Wenn Sie fertig sind, sollte das Steuerfeld mit den Einstellungen in etwa so aussehen (Hinweis: Seit Version 10.2 definiert Xcode die Variable „DERIVED_FILES_DIR“ aus Gründen der Abwärtskompatibilität immer noch genauso wie DERIVED_FILE_DIR):
Zusätzliche Bibliotheken verknüpfen
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. Eine vollständige Liste finden Sie unter Erforderliche Verknüpfungseinstellungen. Hier sind einige Beispiele, welche zusätzlichen Bibliotheken möglicherweise verknüpft werden müssen:
- Wenn Sie das Paket
java.util.zip
verwenden möchten, müssen Sie die Bibliothek „libz.dylib“ verknüpfen. Fügen Sie dazu-ljre_zip
zu Ihren anderen Verknüpfungs-Flags hinzu. - Um eine sichere Hash-Generierung durchzuführen, müssen Sie Ihrem Projekt das Sicherheits-Framework hinzufügen.
Build-Probleme beheben
Wenn Xcode mit diesen Schritten einen Build-Fehler meldet, öffnen Sie die Issue Navigator und klicken Sie auf einen Fehler, um sich die Details anzusehen. Dadurch wird angezeigt, welche Befehlszeilenanweisung ausgeführt wurde. Im Folgenden sind einige häufige Fehler aufgeführt:
Kurs kann nicht aufgelöst werden – Höchstwahrscheinlich war die verwendete
$source-path
falsch. Suchen Sie im ausgeführten Befehl nach der Option-sourcepath
und achten Sie darauf, dass sie auf das Stammverzeichnis Ihrer Java-Quelldateien verweist.Datei"JreEmulation.h" nicht gefunden: Höchstwahrscheinlich ist das Problem ein ungültiger Nutzer-Header-Suchpfad-Wert. Suchen Sie im Build-Befehl nach der Option
-I
mit dem Pfad. Wenn alles in Ordnung ist, kopieren Sie den Pfad (nicht „-I“) und führen Sie in einem Terminalfensterls
mit diesem Pfad aus, um zu prüfen, ob es sich um einen Tippfehler handelt."_IOSClass_FromClass", referenziert von: oder "_OBJCCLASS$_Java" – Entweder ist der Bibliothekssuchpfad falsch oder Sie haben vergessen, die JRE-Emulationsbibliothek zu verknüpfen, indem Sie Other Linker Flags auf
-ljre_emul
gesetzt haben. Möglicherweise müssen Sie auch weitere Bibliotheken verknüpfen.Nicht definierte Symbole: _iconv*: Link in der erforderlichen iconv-Bibliothek.
Wenn Sie weiterhin Probleme haben, wenden Sie sich an die Gruppe „j2objc-discuss“.