يدعم 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 أو أي نظام أساسي آخر من جافا.