ประเภทโปรเจ็กต์ Xcode ส่วนใหญ่รองรับกฎบิลด์ ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์แก้ไขวิธีสร้างประเภทไฟล์ที่มีอยู่และกำหนดวิธีสร้างไฟล์ประเภทใหม่ สคริปต์ J2ObjC ออกแบบมาให้เชื่อมต่อเข้ากับระบบบิลด์อย่าง Xcode
โปรเจ็กต์ j2objc-sample-reversi คือตัวอย่างวิธีเพิ่มซอร์สของ Java ลงในเกม iOS แบบง่าย
บิลด์ขั้นต่ำต้องอัปเดตการตั้งค่าบิลด์ แล้วเพิ่มกฎของบิลด์ J2ObjC
อัปเดตการตั้งค่าบิลด์
- คลิกโปรเจ็กต์ในตัวนำทางโปรเจ็กต์เพื่อเปิดเครื่องมือแก้ไขโปรเจ็กต์ และตรวจสอบว่าได้เลือกเป้าหมายแอปพลิเคชันแล้ว
- คลิกแท็บการตั้งค่าบิลด์
- ลิงก์ไลบรารีการจำลอง JRE (
jre_emul
) โดยเพิ่ม-ljre_emul
ลงใน Flager Flag อื่นๆ ซึ่งควรมีลักษณะดังนี้ - คลิกเครื่องหมาย + และเลือกเพิ่มการตั้งค่าที่ผู้ใช้กำหนด
- ตั้งชื่อการตั้งค่า
J2OBJC_HOME
และกำหนดค่าเป็นตำแหน่งของ J2ObjC นี่ควรจะเป็นโฟลเดอร์ที่เกิดจากการแตกไฟล์ release zip หรือโฟลเดอร์j2objc/dist
หากคุณคอมไพล์จากแหล่งที่มาและรูทของคุณคือj2objc
- ในส่วนเส้นทางการค้นหา ให้แก้ไขต่อไปนี้
- เส้นทางการค้นหาเฟรมเวิร์กเพิ่ม
${J2OBJC_HOME}/frameworks
- เส้นทางการค้นหาไลบรารีจะเพิ่ม
${J2OBJC_HOME}/lib
(สำหรับการกำหนดค่าบิลด์แต่ละรายการ) - เส้นทางการค้นหาส่วนหัวผู้ใช้เพิ่ม
${J2OBJC_HOME}/include
- เส้นทางการค้นหาเฟรมเวิร์กเพิ่ม
- ยืนยันการตั้งค่าโดยค้นหา
J2OBJC_HOME
คุณควรจะเห็นข้อความที่คล้ายกันนี้
การเพิ่มกฎการสร้าง J2ObjC
กำหนดไดเรกทอรีรากของไฟล์ซอร์สของ Java ซึ่งเราเรียกว่า
$source-root
ไดเรกทอรีรากคือไดเรกทอรีที่มีแพ็กเกจยอดนิยมของไฟล์ต้นฉบับหากคุณใช้ git และต้องการดึงไฟล์ Java จากโปรเจ็กต์ Git อื่น ให้เพิ่ม submodule ติดตามโปรเจ็กต์ด้วยซอร์สของ 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 ให้ป้อนเส้นทางแบบเต็มที่ใช้เมื่อแสดงไฟล์เหล่านั้นในหน้าต่างเทอร์มินัล
คลิกโปรเจ็กต์ในตัวนำทางโปรเจ็กต์เพื่อเปิดเครื่องมือแก้ไขโปรเจ็กต์ และตรวจสอบว่าได้เลือกเป้าหมายแอปพลิเคชันแล้ว
คลิกแท็บสร้างกฎ
คลิกเครื่องหมาย + เพื่อเพิ่มกฎการสร้าง
สำหรับตัวเลือกกระบวนการของกฎใหม่ ให้เลือก "ไฟล์ต้นฉบับ 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 ที่แปลแล้ว ดูรายการทั้งหมดได้ที่การตั้งค่าลิงก์ที่จำเป็น ต่อไปนี้คือตัวอย่าง ไลบรารีเพิ่มเติมที่คุณอาจต้องลิงก์
- หากต้องการใช้แพ็กเกจ
java.util.zip
คุณต้องลิงก์ไลบรารี libz.dylib ด้วยการเพิ่ม-ljre_zip
ลงใน Flager Flag อื่นๆ - หากต้องการสร้างแฮชที่ปลอดภัย คุณต้องเพิ่มเฟรมเวิร์กการรักษาความปลอดภัยไปยังโปรเจ็กต์ของคุณ
การแก้ไขข้อบกพร่องของบิลด์
หาก Xcode รายงานความล้มเหลวของบิลด์ด้วยขั้นตอนเหล่านี้ ให้เปิด Issue Navigator แล้วคลิกที่ข้อผิดพลาดเพื่อตรวจสอบรายละเอียด ซึ่งจะแสดงรายละเอียดของคำสั่งบรรทัดคำสั่งที่มีการดำเนินการ ข้อผิดพลาดที่พบบ่อยมีดังนี้
แก้ไขชั้นเรียนไม่ได้ -
$source-path
ที่คุณใช้ไม่ถูกต้อง มองหาตัวเลือก-sourcepath
ในคำสั่งดำเนินการและตรวจสอบว่าตัวเลือกชี้ไปที่ไดเรกทอรีรากของไฟล์ซอร์สของ Javaไม่พบไฟล์"JreEmulation.h" - ปัญหาน่าจะเกิดจากค่าเส้นทางการค้นหาส่วนหัวผู้ใช้ที่ไม่ถูกต้อง ค้นหาคำสั่งบิลด์สำหรับตัวเลือก
-I
พร้อมเส้นทาง หากเห็นด้วย ให้คัดลอกเส้นทาง (ไม่ใช่ -I) และในหน้าต่างเทอร์มินัลที่เรียกใช้ls
ด้วยเส้นทางนั้นเพื่อยืนยันว่าไม่มีการพิมพ์ผิด"_IOSClass_FromClass", อ้างอิงจาก: หรือ "_OBJCCLASS$_Java" - Library Paths อาจไม่ถูกต้องหรือคุณลืมลิงก์ไลบรารีการจำลอง JRE โดยตั้งค่า Linker Flag อื่นๆ เป็น
-ljre_emul
คุณอาจต้องลิงก์ไลบรารีเพิ่มเติมด้วยสัญลักษณ์ที่ไม่ได้ระบุ: _iconv* - ลิงก์ในไลบรารี iconv ที่จำเป็น
หากยังพบปัญหาอยู่ โปรดสอบถามกลุ่ม j2objc-discuss