การเขียนวิธีการแบบเนทีฟ

J2ObjC สนับสนุนการฝัง Objective-C ลงในเมธอดดั้งเดิมของ Java ซึ่งคล้ายกับวิธี JWT ของ GWT รองรับ การฝัง JavaScript ความแตกต่างหลักระหว่างการฝัง J2ObjC และ GWT คือ J2ObjC ใช้ /*-[ และ ]-*/ เพื่ออธิบายโค้ด Objective-C สถานประกอบการนี้เรียกว่า OCNI (Objective-C แบบเนทีฟ) เพื่อให้แตกต่างจาก JSNI ของ GWT

นี่คือตัวอย่างจาก java.lang.System เวอร์ชันไลบรารีการจำลอง JRE

  public static native long currentTimeMillis() /*-[
    // Use NSDate
    return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
  ]-*/;

J2ObjC คัดลอกความคิดเห็นลบตัวคั่นเพื่อสร้างเนื้อหาของเมธอด:

  + (long long int)currentTimeMillis {
    // Use NSDate
    return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
  }

การนำเข้าจากต้นทาง

J2ObjC สแกนโค้ด Java ที่กำลังแปลเพื่อเพิ่มคำสั่ง #import สำหรับทรัพยากร Dependency ด้วย เป็นการนำเข้าเฟรมเวิร์กพื้นฐาน อย่างไรก็ตาม การนำเข้าที่ต้องใช้โดยโค้ดเนทีฟเท่านั้นจะต้อง เพิ่มแยกต่างหาก หากต้องการเพิ่มการนำเข้า ให้เพิ่มส่วน OCNI เหนือคลาสแรกในไฟล์ต้นฉบับ Java และระบุการนำเข้า เช่น

  package my.project;

  /*-[
  #import "java/lang/NullPointerException.h"
  ]-*/

  public class Test {
    native void test() /*-[
      @throw [[JavaLangNullPointerException alloc] init];
    ]-*/;
  }

การนำเข้าเป็นสิ่งจำเป็นในตัวอย่างข้างต้น เนื่องจากมีการอ้างอิงประเภทเดียวที่อยู่ใน โค้ดแบบเนทีฟ

การบล็อกแบบเนทีฟ

J2ObjC จะสแกนหาบล็อก OCNI ภายในเนื้อหาของชั้นเรียน บล็อกเหล่านี้จะถูกเพิ่มโดยไม่มีการแก้ไขในส่วน ไฟล์ที่แปลแล้ว ในตำแหน่งเดียวกันกับสมาชิกในชั้นเรียนที่แปล เช่น

  /*-[
    static void log(NSString *msg) {
      NSLog(@"%@", msg);
    }
  ]-*/;

ฟังก์ชัน C นี้จะเรียกใช้จากเมธอดเนทีฟใดก็ได้ที่ประกาศหลังจากการบล็อก OCNI นี้

ตัวแปรพิเศษของบล็อก OCNI นี้จะแทรกโค้ดในส่วนหัวที่สร้างขึ้นแทน ของไฟล์ .m: /*-HEADER[...]

การเรียกใช้เมธอด Java จากโค้ดแบบเนทีฟ

public native void bar(JSNIExample x, String s) /*-[
  // Call instance method instanceFoo() on this
  [self instanceFooWithNSString:s];

  // Call instance method instanceFoo() on x
  [x instanceFooWithNSString:s];

  // Call static method staticFoo()
  JSNIExample_staticFooWithNSString_(s);
]-*/;

การเข้าถึงช่องจากโค้ดเนทีฟ

หากต้องการอ่านช่องอินสแตนซ์ ให้ใช้ myInstanceField_ หรือ self->myInstanceField_ คำต่อท้ายที่ตามหลังหลีกเลี่ยงการขัดแย้งกันระหว่างเมธอด ที่มีชื่อเดียวกัน

โปรดทราบว่าช่องที่มีชื่อที่สงวนไว้จะมีขีดล่าง 2 ขีด ตัวอย่างเช่น ฟิลด์ชื่อ "id" เป็นสิ่งที่ถูกกฎหมายใน Java แต่ไม่ใช่ในวัตถุประสงค์ C เมื่อแปลแล้ว ฟิลด์นี้จะมีชื่อว่า "id__" ดังนั้น โปรดตรวจสอบไฟล์ที่สร้างขึ้น มี "ไม่มีฟิลด์ดังกล่าว" ข้อผิดพลาดของคอมไพเลอร์

หากต้องการเขียนไปยังช่องอินสแตนซ์ของออบเจ็กต์ ให้ใช้ JSNIExample_set_myInstanceField(string)

อ่านช่องแบบคงที่: JSNIExample_get_myStaticField()

เขียนช่องแบบคงที่: JSNIExample_set_myStaticField(value)

J2ObjC และ GWT

ระบบเลือกตัวคั่นที่แตกต่างกัน ดังนั้นความคิดเห็นใน GWT JSNI ในรุ่น J2ObjC ครั้งถัดไปจะ ละเว้น (ก่อนหน้านี้มีการใช้ตัวคั่นเดียวกันคือ GWT) ซึ่งหมายความว่าที่มา Java แหล่งเดียวสามารถ มีเมธอดแบบเนทีฟที่มีการติดตั้งใช้งาน Objective-C, GWT และ Android (ผ่าน JNI)

  static native void log(String text) /*-{ // left-brace for JavaScript
    console.log(text);
  }-*/ /*-[                                // left-bracket for Objective-C
     NSLog(@"%@", text);
  ]-*/;

J2ObjC และ Android

J2ObjC และเมธอด Android ที่มาพร้อมเครื่อง "ใช้งานได้เลย" เนื่องจากเมธอด Android แบบดั้งเดิม ที่นำไปใช้ในไฟล์ JNI C หรือ C++ แยกต่างหาก ระบบจะนำความคิดเห็น OCNI ในชั้นเรียน Java ออกเมื่อ คอมไพล์โดย Javac สำหรับ Android หรือแพลตฟอร์ม Java อื่นๆ