Java 资源如何映射到 iOS 资源

什么是 Java 资源

Java 资源是与 Java 应用和库打包在一起的数据文件。这些资源会在运行时加载:Class.getResource(String name)(返回 java.net.URL)或 Class.getResourceAsStream(String name)(返回 java.io.InputStream)。通常在预计资源可用时使用 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") 的完整资源路径为 /oops/error.jpg,忽略 foo.bar 软件包名称。

向 iOS 应用添加资源

如需在 Xcode 中为 iOS 应用添加资源文件,请打开 build 目标的“Build Phases”标签页。然后,执行以下操作:

  • 点击“General”标签页下的 + 图标,然后选择“New Copy Files Phase”。
  • 选择“Resources”(资源)作为目标(不是 Java Resources)。
  • 指定资源目录。
  • 选择 +,然后将文件添加到相应的列表中。

无论使用相对资源路径还是绝对资源路径,每个资源目录都需要在 Xcode 构建中完成单独的复制文件构建阶段。

示例

JreEmulation 项目有一个“JRE JUnit 测试”应用,用于运行该库的单元测试。选择该目标的“Build Phases”(构建阶段)以查看多个复制文件阶段,其资源使用的每个相对路径各有一个阶段。在这里,ClassTest.java 会依次使用绝对路径和相对路径加载同一资源。该测试的资源包含在以下复制文件构建阶段中:

Xcode 资源