Zuordnung von Java-Ressourcen zu iOS-Ressourcen

Was sind Java-Ressourcen?

Java-Ressourcen sind Datendateien, die zusammen mit Java-Anwendungen und -Bibliotheken verpackt sind. Diese Ressourcen werden zur Laufzeit geladen, entweder Class.getResource(String name), der einen java.net.URL zurückgibt, oder Class.getResourceAsStream(String name), der einen java.io.InputStream zurückgibt. Die Methode getResourceAsStream() wird normalerweise verwendet, wenn eine Ressource voraussichtlich verfügbar ist, da sie andernfalls ein IOException auslöst. Die Methode getResource() gibt null zurück, wenn die Ressource nicht vorhanden ist. Daher ist es hilfreich, nach optionalen Ressourcen zu testen.

Ressourcennamen und -pfade

J2ObjC sucht Ressourcen im Haupt-Bundle ([NSBundle mainBundle]) der Anwendung und verwendet dabei den relativen oder absoluten Pfad der Ressource:

Relative Pfade

Die bevorzugte Methode zum Angeben von Ressourcenpfaden ist die Verwendung relativer Pfade. Relative Pfade beginnen nicht mit einem Schrägstrich (/). Wenn Sie eine Ressource mit einem relativen Pfad lesen, wird der Paketname der Klasse geändert, indem die Punkte ('.') im Paketnamen in Schrägstriche ('/') geändert werden. Anschließend wird der im Methodenaufruf Class.getResource(String name) oder Class.getResourceAsStream(String name) angegebene relative Pfad an den Paketpfad angehängt.

Wenn eine Anwendung beispielsweise die Klasse foo.bar.Mumble hat, ist der Basispfad für alle Ressourcen im Verhältnis zu den Klassen in diesem Paket /foo/bar. Wenn Mumble.class.getResource("oops/error.jpg") aufgerufen wird, wird oops/error.jpg an den Pfad des Pakets angehängt, sodass der vollständige Ressourcenpfad /foo/bar/oops/error.jpg lautet.

Absolute Pfade

Der Zugriff auf eine Ressource kann auch über einen absoluten Pfad erfolgen. Dazu muss der Name der Ressource mit einem Schrägstrich (/) beginnen. Paketnamen werden ignoriert, sodass J2ObjC die absoluten Pfade im Haupt-Bundle der Anwendung genau so ermittelt, wie sie in den Class.getResource(String name)- oder Class.getResourceAsStream(String name)-Referenzen in den Java-Quellen der Anwendung angegeben sind. Im obigen Beispiel hat Mumble.class.getResource("/oops/error.jpg") den vollständigen Ressourcenpfad /oops/error.jpg und ignoriert den Paketnamen foo.bar.

Einer iOS-App Ressourcen hinzufügen

Um Ressourcendateien zu einer iOS-App in Xcode hinzuzufügen, öffnen Sie den Tab Build Phases (Build-Phasen) des Build-Ziels. Dann:

  • Klicken Sie auf dem Tab „Allgemein“ auf das Symbol + und wählen Sie „Neue Dateikopie-Phase“ aus.
  • Wählen Sie „Ressourcen“ als Ziel aus (nicht Java-Ressourcen).
  • Geben Sie das Verzeichnis für die Ressource(n) an.
  • Wählen Sie + aus und fügen Sie die Datei(en) der Liste hinzu.

Unabhängig davon, ob relative oder absolute Ressourcenpfade verwendet werden, erfordert jedes Ressourcenverzeichnis eine separate Build-Phase zum Kopieren von Dateien in einem Xcode-Build.

Beispiel

Das JreEmulation-Projekt hat eine Anwendung vom Typ "JRE JUnit Tests", die Einheitentests dieser Bibliothek ausführt. Wählen Sie die Build-Phasen dieses Ziels aus, um mehrere Phasen zum Kopieren von Dateien zu sehen, jeweils eine für jeden relativen Pfad, der von seinen Ressourcen verwendet wird. Hier lädt ClassTest.java dieselbe Ressource, zuerst einen absoluten Pfad und dann einen relativen Pfad. Die Ressource des Tests ist in dieser Build-Phase zum Kopieren von Dateien enthalten:

Xcode-Ressourcen