Xcode-Build-Regeln

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

  1. Klicken Sie in der Projektnavigation auf das Projekt, um den Projekteditor zu öffnen, und prüfen Sie, ob das Anwendungsziel ausgewählt ist.
  2. Klicken Sie auf den Tab Build Settings (Build-Einstellungen).
  3. Verknüpfen Sie die JRE-Emulationsbibliothek (jre_emul), indem Sie -ljre_emul zu Other Linker Flags hinzufügen. Sie sollte so aussehen: JRE-Emulationsbibliothek in Xcode verknüpfen
  4. Klicken Sie auf + und wählen Sie Benutzerdefinierte Einstellung hinzufügen aus.
  5. 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 Ordner j2objc/dist, wenn Sie aus der Quelle kompiliert haben und Ihr Stammverzeichnis j2objc ist.
  6. Ä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.
  7. Bestätigen Sie Ihre Einstellungen, indem Sie nach J2OBJC_HOME suchen. Sie sollten in etwa Folgendes sehen: Xcode-Build-Einstellungen

J2ObjC-Build-Regel hinzufügen

  1. 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 weiteres MyProject-Verzeichnis mit Ihrer Objective-C-Quelle. Führen Sie im Verzeichnis ~/dev/MyProject/MyProject den Befehl git 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 Gruppe MyProject 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.

  2. Klicken Sie in der Projektnavigation auf das Projekt, um den Projekteditor zu öffnen, und prüfen Sie, ob das Anwendungsziel ausgewählt ist.

  3. Klicken Sie auf den Tab Build-Regeln.

  4. Klicken Sie auf +, um eine Build-Regel hinzuzufügen.

  5. Wählen Sie für die Option Prozess der neuen Regel die Option „Java-Quelldateien“ aus. Unter Verwendung sollte „Benutzerdefiniertes Skript:“ ausgewählt sein.

  6. 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};
    
  7. Klicken Sie im Bereich „Ausgabedateien“ auf die Schaltfläche + und fügen Sie Folgendes hinzu: ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h.

  8. 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):

Xcode-Build-Regeln

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 Terminalfenster ls 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“.