Java リソースを iOS リソースにマッピングする方法

Java リソースとは

Java リソースは、Java アプリケーションおよびライブラリにパッケージ化されたデータファイルです。これらのリソースは、java.net.URL を返す Class.getResource(String name) か、java.io.InputStream を返す Class.getResourceAsStream(String name) または実行時に読み込まれます。getResourceAsStream() メソッドは、通常、リソースが利用可能であることが想定される場合に使用されます。利用できない場合は IOException をスローします。リソースが存在しない場合、getResource() メソッドは null を返すため、オプションのリソースをテストすると便利です。

リソース名とパス

J2ObjC は、リソースの相対パスまたは絶対パスを使用してアプリケーションのメインバンドル([NSBundle mainBundle])内でリソースを探します。

相対パス

リソースパスを指定する際は、相対パスを使用することをおすすめします。相対パスはスラッシュ(「/」)で始まっていません。相対パスを持つリソースを読み取る場合、クラスのパッケージ名が変更され、パッケージ名のピリオド(「.」)がスラッシュ(「/」)に変更され、Class.getResource(String name) または Class.getResourceAsStream(String name) メソッド呼び出しで指定された相対パスがパッケージ パスに追加されます。

たとえば、アプリに foo.bar.Mumble クラスがある場合、そのパッケージ内のクラスを基準とするすべてのリソースのベースパスは /foo/bar です。Mumble.class.getResource("oops/error.jpg") が呼び出されると、oops/error.jpg がパッケージのパスに付加されるため、その完全なリソースパスは /foo/bar/oops/error.jpg になります。

絶対パス

リソースには、リソースの名前をスラッシュ(「/」)で始めることで、絶対パスを使用してアクセスすることもできます。パッケージ名は無視されるため、J2ObjC は、アプリの Java ソースの Class.getResource(String name) 参照または Class.getResourceAsStream(String name) 参照に指定されたパスを使用して、アプリケーションのメインバンドル内の絶対パスを特定します。上記の例では、Mumble.class.getResource("/oops/error.jpg") には foo.bar パッケージ名を無視して /oops/error.jpg の完全なリソースパスが含まれています。

iOS アプリにリソースを追加する

Xcode で iOS アプリにリソース ファイルを追加するには、ビルド ターゲットの [Build Phases] タブを開きます。以下の手順を行います。

  • [General] タブの [+] アイコンをクリックし、[New Copy Files Phase] を選択します。
  • [Destination] で [Resources] を選択します([Java Resources] ではありません)。
  • リソースのディレクトリを指定します。
  • [+] を選択し、リストにファイルを追加します。

相対リソースパスと絶対リソースパスのどちらを使用するかにかかわらず、各リソース ディレクトリには、Xcode ビルドで個別の「ファイルのコピー」ビルドフェーズが必要です。

JreEmulation プロジェクトには、ライブラリの単体テストを実行する「JRE JUnit Tests」アプリがあります。ターゲットのビルドフェーズを選択すると、リソースで使用されるすべての相対パスに 1 つずつ、複数のファイルのコピー フェーズが表示されます。ここで ClassTest.java は、最初に絶対パスを使用してから相対パスを使用して同じリソースを読み込みます。テストのリソースは、次の Copy Files ビルドフェーズを使用して組み込まれます。

Xcode リソース