วิธีที่ทรัพยากรของ 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 จะค้นหาเส้นทางสัมบูรณ์ในกลุ่มหลักของแอปพลิเคชันโดยใช้เส้นทางตามที่ระบุไว้ในการอ้างอิง Class.getResource(String name) หรือ Class.getResourceAsStream(String name) ในซอร์ส Java ของแอปพลิเคชัน ในตัวอย่างข้างต้น Mumble.class.getResource("/oops/error.jpg") มีเส้นทางทรัพยากรแบบเต็มเป็น /oops/error.jpg โดยไม่สนใจชื่อแพ็กเกจ foo.bar

การเพิ่มทรัพยากรไปยังแอป iOS

หากต้องการเพิ่มไฟล์ทรัพยากรไปยังแอป iOS ใน Xcode ให้เปิดแท็บบิลด์ของเป้าหมายบิลด์ จากนั้นให้ทำดังนี้

  • คลิกไอคอน + (ใต้แท็บ General) แล้วเลือก New Copy Files Phase
  • เลือก "ทรัพยากร" เป็นปลายทาง (ไม่ใช่ทรัพยากรของ Java)
  • ระบุไดเรกทอรีสำหรับทรัพยากร
  • เลือก + แล้วเพิ่มไฟล์ลงในรายการ

ไม่ว่าจะใช้เส้นทางทรัพยากรแบบสัมพัทธ์หรือแบบสัมบูรณ์ ไดเรกทอรีทรัพยากรแต่ละรายการจะมีเฟสของ "คัดลอกไฟล์" แยกต่างหากในบิลด์ Xcode

ตัวอย่าง

โปรเจ็กต์ JreEmulation มีแอป "JRE JUnit Tests" ที่เรียกใช้การทดสอบหน่วยของไลบรารีนั้น เลือกระยะการสร้างของเป้าหมายเพื่อดูขั้นตอนการคัดลอกไฟล์หลายๆ เฟส โดยแต่ละขั้นสำหรับแต่ละเส้นทางที่เกี่ยวข้องที่ทรัพยากรใช้ ในตัวอย่างนี้ ClassTest.java จะโหลดทรัพยากรเดียวกันโดยใช้เส้นทางสัมบูรณ์ก่อน จากนั้นจึงโหลดเส้นทางแบบสัมพัทธ์ ทรัพยากรของการทดสอบรวมอยู่ในระยะบิลด์ของ "คัดลอกไฟล์" นี้

แหล่งข้อมูล Xcode