Cómo se asignan los recursos de Java a los recursos de iOS

¿Qué son los recursos de Java?

Los recursos de Java son archivos de datos que se empaquetan con aplicaciones y bibliotecas de Java. Estos recursos se cargan durante el tiempo de ejecución, ya sea Class.getResource(String name), que muestra un java.net.URL, o Class.getResourceAsStream(String name), que muestra un java.io.InputStream. Por lo general, se usa el método getResourceAsStream() cuando se espera que un recurso esté disponible, ya que arroja una IOException si no lo está. El método getResource() muestra un valor nulo si el recurso no está presente, por lo que es útil probar los recursos opcionales.

Rutas de acceso y nombres de recursos

J2ObjC ubica los recursos buscando en el paquete principal de la aplicación ([NSBundle mainBundle]) mediante la ruta relativa o absoluta del recurso:

Rutas de acceso relativas

El método preferido para especificar rutas de acceso de recursos es usar rutas de acceso relativas. Las rutas de acceso relativas no comienzan con una barra diagonal (/). Cuando se lee un recurso con una ruta relativa, se modifica el nombre del paquete de la clase y se cambian los puntos ('.') del nombre del paquete a barras diagonales (/). Luego, la ruta relativa especificada en la llamada de método Class.getResource(String name) o Class.getResourceAsStream(String name) se agrega a la ruta del paquete.

Por ejemplo, si una app tiene una clase foo.bar.Mumble, la ruta base para todos los recursos relacionados con las clases en ese paquete es /foo/bar. Cuando se invoca Mumble.class.getResource("oops/error.jpg"), oops/error.jpg se agrega a la ruta de acceso del paquete, por lo que la ruta completa del recurso es /foo/bar/oops/error.jpg.

Rutas absolutas

También se puede acceder a un recurso mediante una ruta de acceso absoluta si se inicia el nombre del recurso con una barra diagonal (/). Los nombres de los paquetes se ignoran, por lo que J2ObjC localiza las rutas de acceso absolutas en el paquete principal de la aplicación usando las rutas de acceso exactamente como se especifican en las referencias Class.getResource(String name) o Class.getResourceAsStream(String name) en las fuentes Java de la aplicación. En el ejemplo anterior, Mumble.class.getResource("/oops/error.jpg") tiene una ruta de acceso al recurso completa de /oops/error.jpg y ignora el nombre del paquete foo.bar.

Cómo agregar recursos a una app para iOS

Para agregar archivos de recursos a una app para iOS en Xcode, abre la pestaña Fases de compilación del destino de la compilación. Luego, haz lo siguiente:

  • Haz clic en el ícono + (debajo de la pestaña General) y selecciona Nueva fase de copia de archivos.
  • Selecciona "Resources" como destino (no Java Resources).
  • Especifica el directorio para los recursos.
  • Selecciona + y agrega los archivos a su lista.

Independientemente de si se usan rutas de acceso a recursos relativas o absolutas, cada directorio de recursos requiere una fase de compilación de Copy Files independiente en una compilación de Xcode.

Ejemplo

El proyecto JreEmulation tiene una app "JRE JUnit Tests" que ejecuta las pruebas de unidades de esa biblioteca. Selecciona las fases de compilación de ese destino para ver varias fases de Copy Files, una por cada ruta de acceso relativa que usan sus recursos. Aquí, ClassTest.java carga el mismo recurso con primero una ruta de acceso absoluta y, luego, una ruta relativa. El recurso de la prueba se incluye en esta fase de compilación de la copia de archivos:

Recursos de Xcode