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

J2ObjC รองรับการฝัง Objective-C ในเมธอดแบบเนทีฟของ Java ซึ่งคล้ายกับวิธีที่ JWT ของ JSNI รองรับการฝัง JavaScript อย่างมาก ความแตกต่างหลักระหว่างการฝัง J2ObjC กับของ GWT คือ J2ObjC ใช้ /*-[ และ ]-*/ ในการร่างโค้ด Objective-C สถานที่แห่งนี้เรียกว่า OCNI (Objective-C Native Interface) เพื่อให้แตกต่างจาก 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 แต่ไม่ใช่ใน Objective C เมื่อแปลแล้ว ช่องนั้นจะมีชื่อว่า "id__" ดังนั้น โปรดตรวจสอบไฟล์ที่สร้างขึ้นว่ามีข้อผิดพลาด ของคอมไพเลอร์ "no-such-field" หรือไม่

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

อ่านฟิลด์ค่าคงที่: JSNIExample_get_myStaticField()

เขียนฟิลด์ค่าคงที่: JSNIExample_set_myStaticField(value)

J2ObjC และ GWT

มีการเลือกตัวคั่นที่ต่างกันเพื่อให้ใน J2ObjC รุ่นถัดไป ระบบจะละเว้นความคิดเห็นของ GWT JSNI (ก่อนหน้านี้ใช้ตัวคั่นเดียวกันกับ 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 อื่นๆ