ขั้นตอนการสร้างลิงก์ (ระยะบิลด์ "ลิงก์ไบนารีกับไลบรารี" ของ Xcode) ต้องใช้แฟล็กเฉพาะสำหรับ J2ObjC ซึ่งจะแตกต่างกันไปตามวิธีที่แอปพลิเคชันใช้คลาส Java ที่แปลแล้ว แฟล็กหลักจะกำหนดโดยสคริปต์บรรทัดคำสั่ง j2objcc แต่ต้องระบุไว้เมื่อสร้างด้วย Xcode
ไลบรารี SDK
การใช้งาน JRE ของ J2ObjC จำเป็นกับไลบรารีนี้ การไม่ใส่ไลบรารีนี้จะทำให้เกิดข้อผิดพลาดเกี่ยวกับสัญลักษณ์ที่ไม่ได้กำหนดไว้ที่มีชื่อขึ้นต้นด้วย _iconv
ห้องสมุด | ธงลิงก์ | คำอธิบาย |
---|---|---|
ไอคอนV | -l iconv | ใช้โดย 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 และคลาสยูทิลิตีของ Android เหล่านี้รวมอยู่ในการเผยแพร่แบบ J2ObjC เป็นไลบรารีแบบคงที่
ห้องสมุด | ธงลิงก์ | คำอธิบาย |
---|---|---|
libguava.a | -l ฝรั่ง | Guava: ไลบรารี Google Core สำหรับ Java |
libjavax_inject.a | -l javax_inject | ไลบรารีคำอธิบายประกอบการแทรกทรัพยากร Dependency JSR-330 |
libjson.a | JSON -l | ไลบรารีการแลกเปลี่ยนข้อมูล JSON นี่คือ JSON เวอร์ชัน Android ซึ่งแตกต่างจากการใช้งานแบบอื่นๆ เล็กน้อย |
libjsr305.a | -Ljsr305 | คำอธิบายประกอบ JSR-305 สำหรับไลบรารีการตรวจจับข้อบกพร่องของซอฟต์แวร์ |
libjunit.a | -l junit -ObjC | เฟรมเวิร์กการทดสอบ JUnit |
libmockito.a | -l mockito -ObjC | เฟรมเวิร์กล้อเลียน Mockito สำหรับการทดสอบหน่วยใน Java |
libprotobuf_runtime.a | -l protobuf_runtime | รันไทม์ของ Google Protocol Buffer ที่เพิ่มประสิทธิภาพสําหรับแอป J2ObjC แอปที่ใช้ J2ObjC protobuf ควรคอมไพล์ไฟล์ Proto ด้วย j2objc_protoc |
libandroid_util.a | -l android_util | ไลบรารี `android_util` ประกอบด้วยกลุ่มย่อยของคลาสยูทิลิตี Android API บางส่วน ไฟล์นี้ไม่ได้มีไว้เพื่อการจำลองสภาพแวดล้อม Android แต่เป็นเพียงวิธีแชร์คลาสที่มีประโยชน์ เช่น "android.util.Log" |
แฟล็กลิงก์ -ObjC
แฟล็ก -ObjC มักใช้เมื่อลิงก์แอป iOS แต่จะใช้เมื่อต้องโหลดคลาสและหมวดหมู่ของ Objective C แบบไดนามิกจากไลบรารีแบบคงที่เท่านั้น แฟล็กนี้ทำให้รวมคลาสทั้งหมดในไลบรารีแบบคงที่ที่ลิงก์ทั้งหมดไว้ในแอป ไม่ว่าจะใช้งานจริงหรือไม่ก็ตาม ดังนั้นขอแนะนำให้แอปที่ใช้ J2ObjC ลิงก์กับแฟล็ก -ObjC เท่านั้นเมื่อโหลดคลาสไม่สำเร็จขณะรันไทม์ (อาการหนึ่งคือเมื่อพบ JavaLangClassNotFoundException
)
เฟรมเวิร์กการทดสอบ JUnit และ Mockito อาศัยการทบทวนเป็นหลัก ดังนั้นการทดสอบแอปที่ใช้เฟรมเวิร์กเหล่านี้ควรลิงก์กับ -ObjC
อีกทางเลือกหนึ่งนอกเหนือจากการลิงก์ในไลบรารีแบบคงที่ทั้งหมดเพื่อให้โหลดแบบไดนามิกได้ 2-3 คลาสคือการอ้างอิงคลาสเหล่านั้นแบบคงที่แทน ใน Java คุณสามารถทำได้ในบล็อกการเริ่มต้นแบบคงที่ นี่เป็นตัวอย่างจากคลาส IosSecurityProvider ของ J2ObjC
// 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
};