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

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