روش های بومی نوشتن

J2ObjC از جاسازی Objective-C در روش های بومی جاوا پشتیبانی می کند، بسیار شبیه به نحوه پشتیبانی JSNI GWT از جاسازی جاوا اسکریپت. تفاوت اصلی بین جاسازی 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 کد جاوا را در حال ترجمه اسکن می کند تا دستورات #واردات را برای وابستگی های آن اضافه کند و همچنین چارچوب بنیاد را وارد کند. با این حال، هر وارداتی که فقط توسط کد بومی مورد نیاز است باید به طور جداگانه اضافه شود. برای افزودن واردات، یک بخش OCNI در بالای کلاس اول در فایل منبع جاوا اضافه کنید و واردات را در آنجا مشخص کنید. مثلا:

  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[...]

فراخوانی متدهای جاوا از کد بومی

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);
]-*/;

دسترسی به فیلدهای Native Code

برای خواندن یک فیلد نمونه، از myInstanceField_ یا self->myInstanceField_ استفاده کنید. پسوند انتهایی از برخورد با روش هایی با نام مشابه جلوگیری می کند.

توجه داشته باشید که فیلدهایی که اسامی رزرو شده دارند دو خط زیرخط خواهند داشت. به عنوان مثال، فیلدی به نام "id" در جاوا قانونی است، اما در هدف C نیست. وقتی ترجمه شود، آن فیلد "id__" نامیده می شود. بنابراین، لطفاً در صورت وجود خطاهای کامپایلر "بدون چنین فیلدی"، فایل های تولید شده را بررسی کنید.

برای نوشتن در یک فیلد نمونه شی، از JSNIExample_set_myInstanceField(string) استفاده کنید

خواندن یک فیلد ثابت: JSNIExample_get_myStaticField()

یک فیلد ثابت بنویسید: JSNIExample_set_myStaticField(value)

J2ObjC و GWT

جداکننده‌های مختلفی انتخاب شدند تا در نسخه بعدی J2ObjC، نظرات GWT JSNI نادیده گرفته شوند (قبلاً همان جداکننده‌های GWT استفاده می‌شدند). این بدان معنی است که یک منبع جاوا می تواند متدهای بومی داشته باشد که دارای پیاده سازی 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 و اندروید

پیاده‌سازی روش‌های بومی J2ObjC و اندروید «فقط کار می‌کنند»، زیرا روش‌های بومی اندروید در یک فایل JNI C یا C++ جداگانه پیاده‌سازی می‌شوند. هر نظر OCNI در کلاس‌های جاوا هنگام کامپایل شدن توسط javac برای اندروید یا هر پلتفرم جاوا دیگر حذف می‌شود.