كتابة الطرق الأصلية

يدعم J2ObjC تضمين Objective-C في طرق Java الأصلية، بطريقة تشبه إلى حد كبير كيفية تتوافق JSNI من GWT مع تضمين JavaScript: الفرق الرئيسي بين تضمين J2ObjC وGWT هو أن J2ObjC يستخدم /*-[ و]-*/ لتحديد رمز الهدف ج. يُطلق على هذه المنشأة اسم OCNI (هدف-ج) 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 لتبعياته أيضًا على استيراد إطار العمل الأساسي. ومع ذلك، يجب تنفيذ أي عمليات استيراد لا يحتاج إليها سوى الرمز البرمجي الأصلي تتم إضافتها بشكل منفصل. لإضافة عمليات استيراد، أضِف قسم 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);
]-*/;

الوصول إلى الحقول من رمز Native Code

لقراءة حقل مثال، استخدِم myInstanceField_ أو self->myInstanceField_ تتجنب اللاحقة اللاحقة أي تعارض مع الطرق تحمل نفس الاسم.

لاحظ أن الحقول التي لها أسماء محجوزة لها شرطتان سفلية. على سبيل المثال: حقل يسمى "id" يعد أمرًا قانونيًا في Java، ولكن ليس في الهدف C. وعند الترجمة، ستتم تسمية هذا الحقل "id__". وبالتالي، يُرجى التحقق من الملفات التي تم إنشاؤها إذا لا يوجد حقل "no-this-field" أخطاء برنامج التجميع.

للكتابة إلى حقل نسخة افتراضية من الكائن، استخدِم 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 أو أي نظام أساسي آخر من جافا.