การตั้งค่าลิงก์ที่จำเป็น

ขั้นตอนการสร้างลิงก์ (ระยะบิลด์ "ลิงก์ไบนารีกับไลบรารี" ของ 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 มักใช้เมื่อลิงก์แอป 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
  };