ขั้นตอนการสร้างลิงก์ (เฟสการสร้าง "ลิงก์ไบนารีกับไลบรารี" ของ Xcode) ต้องใช้ Flag เฉพาะ J2ObjC ซึ่งจะแตกต่างกันไปตามวิธีที่แอปพลิเคชันใช้คลาส Java ที่แปลแล้ว Flag หลักจะกำหนดตาม สคริปต์บรรทัดคำสั่ง j2objcc แต่ต้องระบุเมื่อสร้าง ด้วย Xcode
ไลบรารี SDK
จําเป็นต้องใช้ไลบรารีนี้โดยการติดตั้งใช้งาน JRE ของ J2ObjC ไม่ระบุ
Library จะทำให้เกิดข้อผิดพลาดเกี่ยวกับสัญลักษณ์ที่ไม่ได้ระบุไว้ว่าเป็นชื่อที่ขึ้นต้นด้วย _iconv
คลัง | ธงลิงก์ | คำอธิบาย |
---|---|---|
iconv | -l ไอคอนv | ใช้โดย jre_core ในการเข้ารหัสและถอดรหัสอักขระ |
ไลบรารีเหล่านี้ใช้งานโดยการใช้งาน JRE ของ J2ObjC และอาจต้องลิงก์เข้ากับแอปของคุณ
คลัง | ธงลิงก์ | คำอธิบาย |
---|---|---|
zip | -l z | ใช้โดย java.util.zip คุณต้องระบุข้อมูลนี้หากจะลิงก์ jre_zip |
ความปลอดภัย | -เฟรมเวิร์ก ความปลอดภัย | จำเป็นหากลิงก์ jre_security |
เส้นทางการค้นหาห้องสมุด
การกระจายของ J2ObjC ประกอบด้วยไลบรารีแบบคงที่หลายรายการ สำหรับการใช้งาน โครงการของคุณจะต้องบอก Linker จะค้นหาได้ที่ไหน
โดยทั่วไปแล้ว เส้นทางการค้นหาห้องสมุดจะต้องประกอบด้วย _$(j2objcdistribution)/lib โดยที่ฟิลด์ ตัวแปร _$(j2objcdistribution) คือเส้นทางไปยังสำเนาของ J2ObjC ที่อยู่ในเครื่อง ตัวอย่างเช่น หากคุณ แตกไฟล์ที่เก็บถาวรสำหรับรุ่น J2ObjC ไปยัง "/usr/local/" เส้นทางนี้จะเป็น "/usr/local/j2objc"
สำคัญ: อย่าใช้ _$(j2objcdistribution) ในโปรเจ็กต์ของคุณ ระบุ เส้นทางจริงที่คุณติดตั้ง J2ObjC
หากคุณสร้าง J2ObjC จากสำเนาของซอร์สโค้ด _$(j2objcdistribution) จะเป็นของสำเนาของคุณ
"j2objc/dist/" ไดเรกทอรี ไดเรกทอรีนี้จะไม่อยู่จนกว่าคุณจะสร้าง J2ObjC ด้วย make dist
Xcode: เส้นทางการค้นหาห้องสมุด
อัปเดตเส้นทางการค้นหาห้องสมุดของเป้าหมายแอปโดยเพิ่ม _$(j2objcdistribution)/lib (กล่าวอีกครั้งคือ เส้นทางจริง)
ห้องสมุด JRE
ไลบรารีเหล่านี้จะใช้คลาสที่กำหนดโดยการจำลอง JRE ของ J2ObjC
หมายเหตุ: ไลบรารี libjre_core.a
มีคลาสจากชุดย่อยอื่นๆ ส่วนใหญ่
ห้องสมุด วิธีที่แนะนำในการลดขนาดแอปคือการเริ่มลิงก์แอป
ด้วย -l jre_core
แล้วเพิ่มไลบรารีชุดย่อยซึ่งแก้ไขสัญลักษณ์ที่ขาดหายไป
ตัวอย่างเช่น คลาส java.io
ที่ใช้กันโดยทั่วไปคือ libjre_core.a
ดังนั้นให้รวมไลบรารี libjre_io.a
เฉพาะเมื่อมีข้อผิดพลาดเกี่ยวกับสัญลักษณ์ที่ยังไม่ได้แก้ไข
ที่ชื่อขึ้นต้นด้วย JavaIo
คลัง | ธงลิงก์ | คำอธิบาย |
---|---|---|
libjre_core.a | -l jre_core | จำนวนชั้นเรียนขั้นต่ำ ที่จำเป็นสำหรับการจำลอง JRE ของ J2ObjC ที่อ้างอิงโดย ไฟล์ต้นฉบับที่สร้างขึ้น หากที่มา Java ที่แปลของคุณอ้างอิงการสนับสนุน JRE สำหรับสิ่งต่างๆ อย่างเช่นเครือข่าย, XML, SQL ฯลฯ จากนั้นจึงไลบรารีเพิ่มเติม (ด้านล่าง) จะต้องลิงก์ด้วย |
libjre_beans.a | -l jre_beans |
ชั้นเรียนทั้งหมด
จากแพ็กเกจ java.beans คลาส Java Beans บางคลาส
ซึ่งรวมถึงแอปมากมายที่ใช้เฉพาะแอป Swing และ AWT
|
libjre_channels.a | -l jre_channels |
หลายชั้นเรียน
จาก java.nio.channels และ java.nio.channels.spi
แพ็กเกจของคุณ
|
libjre_concurrent.a | -l jre_concurrent |
หลายชั้นเรียน
จาก java.util.concurrent java.util.concurrent.atomic
และ java.util.concurrent.locks แพ็กเกจ
|
libjre_icu.a | -l jre_icu |
หลายชั้นเรียน
ตั้งแต่ android.icu เพื่อรองรับเขตเวลา (ส่วนใหญ่คือการเปิดใช้
java.time )
|
libjre_io.a | -l jre_io |
หลายชั้นเรียน (ไม่ค่อยใช้บ่อย)
จากแพ็กเกจ java.io
|
libjre_net.a | -l jre_net |
หลายชั้นเรียน
ในแพ็กเกจ java.net อย่างไรก็ตาม java.net.URLClassLoader
อยู่ใน jre_security ขณะที่ javax.net และ
มี javax.net.ssl ชั้นเรียนอยู่ใน jre_ssl
|
libjre_security.a | -l jre_security |
ชั้นเรียนส่วนใหญ่
ในแพ็กเกจ java.security (บางส่วนอยู่ใน jre_core )
รวมถึงชั้นเรียนในjava.security.*
javax.crypto.* และ javax.security.* แพ็กเกจ
หากลิงก์บัญชี คุณจะต้องลิงก์เฟรมเวิร์กความปลอดภัยของ iOS ด้วย
(ดูไลบรารี SDK)
|
libjre_sql.a | -l jre_sql |
ชั้นเรียนทั้งหมด
ในแพ็กเกจ java.sql
|
libjre_ssl.a | -l jre_ssl |
ชั้นเรียนทั้งหมด
ในแพ็กเกจ javax.net และ javax.net.ssl
|
libjre_time.a | -l jre_time |
ชั้นเรียนทั้งหมด
ในแพ็กเกจ java.time
|
libjre_util.a | -l jre_util |
หลายชั้นเรียน
จากแพ็กเกจ java.util รวมถึง
แพ็กเกจ java.util.logging java.util ชั้นเรียนส่วนใหญ่
อยู่ใน jre_core ดังนั้นโปรดรวมเฉพาะไลบรารีนี้หากมี
เป็นข้อผิดพลาดเกี่ยวกับสัญลักษณ์ JavaUtil* ที่ยังไม่ได้แก้ไข
(สัญลักษณ์ JavaUtilConcurrent* ตัวอยู่ใน
jre_concurrent )
|
libjre_xml.a | -l jre_xml |
ชั้นเรียนทั้งหมด
จากแพ็กเกจที่เกี่ยวข้องกับ XML รวมถึง javax.xml.*
org.w3c.dom.* และ org.xml.sax.*
|
libjre_zip.a | -l jre_zip |
ชั้นเรียนทั้งหมด
จากแพ็กเกจ java.util.zip และ java.util.jar
หากลิงก์บัญชีนี้ คุณจะต้องลิงก์ไลบรารีไฟล์ ZIP ของ SDK ด้วย (โปรดดู
ไลบรารี SDK)
|
libjre_emul.a (-l jre_emul)
ไลบรารี jre_emul
มีคลาสทั้งหมดที่รวมอยู่ในการจำลอง JRE ของ J2ObjC หากแอปคือ
ที่ลิงก์กับ jre_emul
ไม่ควรรวมไลบรารี jre_* อื่นๆ ใดเลย มิฉะนั้น Linker จะ
รายงานข้อผิดพลาดเกี่ยวกับสัญลักษณ์ที่ซ้ำกัน นั่นเป็นเพราะ jre_emul
รวมชั้นเรียนทั้งหมดที่กำหนดไว้ในหมวดหมู่เหล่านั้น
ไลบรารีอื่นๆ
ห้องสมุด J2ObjC อื่นๆ
ไลบรารี Java และคลาส util ของ Android เหล่านี้รวมอยู่ใน J2ObjC การกระจายเป็นไลบรารีแบบคงที่
คลัง | ธงลิงก์ | คำอธิบาย |
---|---|---|
libguava.a | - ฝรั่ง | Guava: ไลบรารีหลักของ Google สำหรับ Java |
libjavax_inject.a | -l javax_inject | การแทรกทรัพยากร Dependency JSR-330 ไลบรารีคำอธิบายประกอบ |
libjson.a | -l JSON | ไลบรารีการแลกเปลี่ยนข้อมูล JSON นี่คือ JSON เวอร์ชัน Android ซึ่งแตกต่างจากการใช้งานอื่นๆ เล็กน้อย |
libjsr305.a | -l jsr305 | คำอธิบายประกอบ JSR-305 สำหรับซอฟต์แวร์ ไลบรารีการตรวจจับข้อบกพร่อง |
libjunit.a | -l junit -ObjC | เฟรมเวิร์กการทดสอบ JUnit |
libmockito.a | -l mockito -ObjC | เฟรมเวิร์ก Mockito จำลองสำหรับการทดสอบหน่วยใน Java |
libprotobuf_runtime.a | -l Protobuf_runtime | บัฟเฟอร์โปรโตคอลของ Google ที่ปรับให้เหมาะกับแอป J2ObjC แอปที่ใช้ J2ObjC Protobufs ควรคอมไพล์ Proto ที่มี j2objc_เลือก |
libandroid_util.a | -l android_util | ไลบรารี "android_util" มีคลาสยูทิลิตี API ของ Android บางส่วน เครื่องมือนี้ไม่ได้มีไว้เพื่อใช้เลียนแบบสภาพแวดล้อมของ Android แต่เพียงเป็นวิธีแชร์ คลาสที่เป็นประโยชน์ เช่น "android.util.Log" |
ธงลิงก์ -ObjC
แฟล็ก -ObjC มักใช้เมื่อลิงก์แอป iOS แต่จำเป็นต้องใช้เมื่อมีวัตถุประสงค์เท่านั้น
ต้องโหลดคลาสและหมวดหมู่ C แบบไดนามิกจากไลบรารีแบบคงที่ การตั้งค่าสถานะนี้
คลาสในไลบรารีแบบคงที่ที่ลิงก์ไว้ทั้งหมดเพื่อรวมไว้ในแอป ไม่ว่าจะ
ดังนั้นจึงขอแนะนำให้แอปที่ใช้ J2ObjC ลิงก์กับแฟล็ก -ObjC เฉพาะเมื่อ
โหลดคลาสไม่สำเร็จขณะรันไทม์ (อาการหนึ่งคือเมื่อมีการทิ้ง JavaLangClassNotFoundException
)
เฟรมเวิร์กของการทดสอบ JUnit และ Mockito อาศัยการสะท้อนความรู้สึกเป็นหลัก ดังนั้นการทดสอบแอปที่ใช้เฟรมเวิร์กเหล่านี้ควร ด้วย -ObjC
อีกทางเลือกหนึ่งนอกเหนือจากการลิงก์ในไลบรารีแบบคงที่ทั้งหมดเพื่อให้โหลดคลาสบางส่วนแบบไดนามิกได้คือ ให้อ้างอิงคลาสเหล่านั้นในเชิงสถิติแทน ใน Java คุณสามารถทำได้โดยใช้ตัวเริ่มต้นแบบคงที่ block; นี่คือตัวอย่างจาก คลาส IosSecurityProvider มีดังนี้
// Reference all dynamically loaded classes, so they are linked into apps.
@SuppressWarnings("unused")
private static final Class<?>[] unused = {
IosCertificateFactory.class,
IosMD5MessageDigest.class,
IosRSAKeyFactory.class,
IosRSAKeyPairGenerator.class,
IosRSASignature.class,
IosSecureRandomImpl.class,
IosSHAMessageDigest.class
};