ประเภทโปรเจ็กต์ Xcode ส่วนใหญ่รองรับกฎการสร้าง ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์แก้ไข วิธีสร้างประเภทไฟล์ที่มีอยู่ และเพื่อกำหนดวิธีการสร้างประเภทไฟล์ใหม่ สคริปต์ J2ObjC ได้รับการออกแบบขึ้นมาโดยตั้งใจเพื่อใช้งานร่วมกับระบบภายในอย่าง Xcode
โปรเจ็กต์ j2objc-sample-reversi คือ ตัวอย่างวิธีเพิ่มซอร์สของ Java ลงในเกม iOS แบบง่ายๆ
บิลด์ขั้นต่ำที่ต้องอัปเดตการตั้งค่าบิลด์ แล้วเพิ่มกฎบิลด์ J2ObjC
อัปเดตการตั้งค่าบิลด์
- คลิกโปรเจ็กต์ในตัวนำทางโปรเจ็กต์เพื่อเปิดตัวแก้ไขโปรเจ็กต์และตรวจสอบว่า เลือกเป้าหมายแอปพลิเคชันแล้ว
- คลิกแท็บการตั้งค่าบิลด์
- ลิงก์ไลบรารีการจำลอง JRE (
jre_emul
) โดยเพิ่ม-ljre_emul
ลงใน Linker Flag อื่นๆ ซึ่งควรมีลักษณะดังนี้ - คลิก + และเลือกเพิ่มการตั้งค่าที่กำหนดโดยผู้ใช้
- ตั้งชื่อการตั้งค่าเป็น
J2OBJC_HOME
และกำหนดเป็นตำแหน่งของ J2ObjC สิ่งนี้ควร เป็นโฟลเดอร์ที่เกิดจากการแตกไฟล์ release ZIP หรือโฟลเดอร์j2objc/dist
หากคุณคอมไพล์จากแหล่งที่มาและรูทคือj2objc
- ในส่วนเส้นทางการค้นหา ให้แก้ไขข้อมูลต่อไปนี้
- เส้นทางการค้นหาเฟรมเวิร์กเพิ่ม
${J2OBJC_HOME}/frameworks
- Library Search Paths เพิ่ม
${J2OBJC_HOME}/lib
(สำหรับการกำหนดค่าบิลด์แต่ละรายการ) - เส้นทางการค้นหาส่วนหัวผู้ใช้เพิ่ม
${J2OBJC_HOME}/include
- เส้นทางการค้นหาเฟรมเวิร์กเพิ่ม
- ยืนยันการตั้งค่าโดยการค้นหา
J2OBJC_HOME
คุณจะเห็นข้อมูลที่มีลักษณะคล้ายคลึงกันนี้
การเพิ่มกฎบิลด์ J2ObjC
กำหนดไดเรกทอรีรากของไฟล์ต้นฉบับ 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
คลิกโปรเจ็กต์ในตัวนำทางโปรเจ็กต์เพื่อเปิดตัวแก้ไขโปรเจ็กต์และตรวจสอบว่า เลือกเป้าหมายแอปพลิเคชันแล้ว
คลิกแท็บสร้างกฎ
คลิกเครื่องหมาย + เพื่อเพิ่มกฎบิลด์
สำหรับตัวเลือกกระบวนการของกฎใหม่ ให้เลือก "ไฟล์ต้นฉบับ Java" ตัวเลือกการใช้ควรเป็น "สคริปต์ที่กำหนดเอง:"
ในช่องข้อความของสคริปต์ที่กำหนดเอง ให้เพิ่มรายการต่อไปนี้ (อย่าลืมแทน
$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};
ในแผงไฟล์เอาต์พุต ให้คลิกปุ่ม + แล้วเพิ่ม
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h
คลิกปุ่ม + อีกครั้ง แล้วเพิ่ม
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m
เมื่อคุณทำเสร็จแล้ว แผงการตั้งค่าควรมีลักษณะประมาณนี้ (หมายเหตุ: เมื่อถึงวันที่ 10.2 Xcode ยังคงกำหนดฟิลด์ ตัวแปร DERIVED_FILES_DIR เหมือนกับ DERIVED_FILE_DIR สำหรับความเข้ากันได้แบบย้อนหลัง):
การลิงก์ไลบรารีเพิ่มเติม
ต้องการขั้นตอนการสร้างลิงก์ (เฟสการสร้าง "ลิงก์ไบนารีกับไลบรารี" ของ 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