กฎบิลด์ของ Xcode

ประเภทโปรเจ็กต์ Xcode ส่วนใหญ่รองรับกฎการสร้าง ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์แก้ไข วิธีสร้างประเภทไฟล์ที่มีอยู่ และเพื่อกำหนดวิธีการสร้างประเภทไฟล์ใหม่ สคริปต์ J2ObjC ได้รับการออกแบบขึ้นมาโดยตั้งใจเพื่อใช้งานร่วมกับระบบภายในอย่าง Xcode

โปรเจ็กต์ j2objc-sample-reversi คือ ตัวอย่างวิธีเพิ่มซอร์สของ Java ลงในเกม iOS แบบง่ายๆ

บิลด์ขั้นต่ำที่ต้องอัปเดตการตั้งค่าบิลด์ แล้วเพิ่มกฎบิลด์ J2ObjC

อัปเดตการตั้งค่าบิลด์

  1. คลิกโปรเจ็กต์ในตัวนำทางโปรเจ็กต์เพื่อเปิดตัวแก้ไขโปรเจ็กต์และตรวจสอบว่า เลือกเป้าหมายแอปพลิเคชันแล้ว
  2. คลิกแท็บการตั้งค่าบิลด์
  3. ลิงก์ไลบรารีการจำลอง JRE (jre_emul) โดยเพิ่ม -ljre_emul ลงใน Linker Flag อื่นๆ ซึ่งควรมีลักษณะดังนี้ การลิงก์ไลบรารี JRE Emulation ใน Xcode
  4. คลิก + และเลือกเพิ่มการตั้งค่าที่กำหนดโดยผู้ใช้
  5. ตั้งชื่อการตั้งค่าเป็น J2OBJC_HOME และกำหนดเป็นตำแหน่งของ J2ObjC สิ่งนี้ควร เป็นโฟลเดอร์ที่เกิดจากการแตกไฟล์ release ZIP หรือโฟลเดอร์ j2objc/dist หากคุณคอมไพล์จากแหล่งที่มาและรูทคือ j2objc
  6. ในส่วนเส้นทางการค้นหา ให้แก้ไขข้อมูลต่อไปนี้
    • เส้นทางการค้นหาเฟรมเวิร์กเพิ่ม ${J2OBJC_HOME}/frameworks
    • Library Search Paths เพิ่ม ${J2OBJC_HOME}/lib (สำหรับการกำหนดค่าบิลด์แต่ละรายการ)
    • เส้นทางการค้นหาส่วนหัวผู้ใช้เพิ่ม ${J2OBJC_HOME}/include
  7. ยืนยันการตั้งค่าโดยการค้นหา J2OBJC_HOME คุณจะเห็นข้อมูลที่มีลักษณะคล้ายคลึงกันนี้ การตั้งค่าบิลด์ Xcode

การเพิ่มกฎบิลด์ J2ObjC

  1. กำหนดไดเรกทอรีรากของไฟล์ต้นฉบับ Java ซึ่งเราเรียกว่า $source-root ไดเรกทอรีรากคือไดเรกทอรีที่มีส่วนบนสุด แพ็กเกจของไฟล์ต้นฉบับของคุณ

    • หากใช้ git และต้องการดึงไฟล์ Java จากโปรเจ็กต์ git อื่น คุณสามารถ เพิ่มโมดูลย่อยที่ติดตามโปรเจ็กต์ด้วย Java แหล่งที่มา ตัวอย่างเช่น สมมติว่าโปรเจ็กต์ Xcode (xcodeproj) อยู่ใน ~/dev/MyProject และคุณ น่าจะมีไดเรกทอรี MyProject อีกรายการที่มีแหล่งที่มา Objective-C ของคุณ ใน ไดเรกทอรี ~/dev/MyProject/MyProject เรียกใช้ git submodule add git@github.com:user/javaproject ถึง สร้างไดเรกทอรี ~/dev/MyProject/MyProject/javaproject ที่มีซอร์สสำหรับโปรเจ็กต์ Java ควบคู่กับแหล่งที่มาของ Objective-C จากนั้นคุณสามารถลากโฟลเดอร์ดังกล่าวลงในโปรเจ็กต์ Xcode ภายใต้กลุ่ม MyProject ซึ่งมี Xcode ที่มิเรอร์ระบบไฟล์ ${PROJECT_DIR}/MyProject/javaproject/src คือ$source-root

    • หากซอร์สของ Java อยู่ในกลุ่มหรือไดเรกทอรีในโปรเจ็กต์ Xcode ของคุณ $source-root มีค่าเป็น ${PROJECT_DIR}/__group_or_directory_name__

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

    • ตัวอย่างเช่น ถ้าคุณมีแพ็กเกจ Java foo.bar ในไดเรกทอรีที่ชื่อ ~/myproject/src ไฟล์ Java ของแพ็กเกจควรอยู่ใน ~/myproject/src/foo/bar/**.java ซึ่งหมายความว่า ~/myproject/src คือไดเรกทอรีรากสำหรับโปรเจ็กต์ของคุณ

    • หากไฟล์ซอร์สของ Java อยู่นอกโปรเจ็กต์ Xcode ให้ป้อนเส้นทางแบบเต็มที่ใช้เมื่อ แสดงในหน้าต่าง Terminal

  2. คลิกโปรเจ็กต์ในตัวนำทางโปรเจ็กต์เพื่อเปิดตัวแก้ไขโปรเจ็กต์และตรวจสอบว่า เลือกเป้าหมายแอปพลิเคชันแล้ว

  3. คลิกแท็บสร้างกฎ

  4. คลิกเครื่องหมาย + เพื่อเพิ่มกฎบิลด์

  5. สำหรับตัวเลือกกระบวนการของกฎใหม่ ให้เลือก "ไฟล์ต้นฉบับ Java" ตัวเลือกการใช้ควรเป็น "สคริปต์ที่กำหนดเอง:"

  6. ในช่องข้อความของสคริปต์ที่กำหนดเอง ให้เพิ่มรายการต่อไปนี้ (อย่าลืมแทน $source-root):

    if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi;
    "${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILE_DIR} -sourcepath "$source-root" --no-package-directories -g ${INPUT_FILE_PATH};
    
  7. ในแผงไฟล์เอาต์พุต ให้คลิกปุ่ม + แล้วเพิ่ม ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h

  8. คลิกปุ่ม + อีกครั้ง แล้วเพิ่ม ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m

เมื่อคุณทำเสร็จแล้ว แผงการตั้งค่าควรมีลักษณะประมาณนี้ (หมายเหตุ: เมื่อถึงวันที่ 10.2 Xcode ยังคงกำหนดฟิลด์ ตัวแปร DERIVED_FILES_DIR เหมือนกับ DERIVED_FILE_DIR สำหรับความเข้ากันได้แบบย้อนหลัง):

กฎการสร้าง Xcode

การลิงก์ไลบรารีเพิ่มเติม

ต้องการขั้นตอนการสร้างลิงก์ (เฟสการสร้าง "ลิงก์ไบนารีกับไลบรารี" ของ Xcode) แฟล็กเฉพาะ J2ObjC ซึ่งจะแตกต่างกันไปตามวิธีที่แอปพลิเคชันใช้คลาส Java ที่แปลแล้ว ดูรายการทั้งหมดได้ที่การตั้งค่าลิงก์ที่จำเป็น ลองดูแหล่งข้อมูล 2 รายการ เช่น ไลบรารีเพิ่มเติมที่คุณอาจต้องลิงก์

  • หากต้องการใช้แพ็กเกจ java.util.zip คุณต้องลิงก์ไลบรารี libz.dylib ด้วยการเพิ่ม -ljre_zipไปที่แฟล็ก Linker อื่นๆ
  • หากต้องการสร้างแฮชที่ปลอดภัย คุณต้องเพิ่มเฟรมเวิร์กความปลอดภัยลงในโปรเจ็กต์

การแก้ไขข้อบกพร่องของปัญหาบิลด์

หาก Xcode รายงานความล้มเหลวของบิลด์โดยใช้ขั้นตอนเหล่านี้ ให้เปิด Issue Navigator และ คลิกที่ข้อผิดพลาดเพื่อตรวจสอบรายละเอียด ซึ่งจะแสดงรายละเอียดของบรรทัดคำสั่ง ดำเนินการตามคำสั่งแล้ว ข้อผิดพลาดที่พบบ่อยมีดังนี้

  • แก้ไขชั้นเรียนไม่ได้ - เป็นไปได้ว่า $source-path ที่คุณใช้ไม่ถูกต้อง มองหาตัวเลือก -sourcepath ในคำสั่งที่ดำเนินการแล้วและตรวจสอบว่าตัวเลือกดังกล่าวชี้ไปยัง ไดเรกทอรีรากของไฟล์ต้นฉบับ Java

  • "JreEmulation.h" ไม่พบไฟล์ - ปัญหานี้น่าจะเกิดจากการค้นหาส่วนหัวของผู้ใช้ที่ไม่ถูกต้อง เส้นทาง ค้นหาคำสั่งบิลด์สำหรับตัวเลือก -I ที่มีเส้นทาง หากดูดีแล้ว คัดลอกเส้นทาง (ไม่ใช่ -I) และในหน้าต่างเทอร์มินัลให้เรียกใช้ ls ด้วยเส้นทางนั้นเพื่อยืนยัน ไม่ใช่การพิมพ์ผิด

  • "_IOSClass_FromClass", อ้างอิงจาก: หรือ "_OBJCCLASS$_Java" - ไลบรารี เส้นทางการค้นหาไม่ถูกต้องหรือคุณลืมลิงก์ไลบรารีการจำลอง JRE โดยการตั้งค่าอื่นๆ Linker Flag ไปยัง -ljre_emul นอกจากนี้ คุณอาจต้องลิงก์คลังเพิ่มเติม

  • สัญลักษณ์ที่ไม่ได้กำหนด: _iconv* - ลิงก์ในไลบรารี iconv ที่จำเป็น

หากยังพบปัญหา ให้สอบถาม j2objc-discuss group