J2ObjC, Objective-C को Java नेटिव मेथड में एम्बेड करने की सुविधा देता है. यह बिलकुल
GWT का JSNI काम करता है
JavaScript एम्बेड करना. J2ObjC एम्बेडिंग और GWT के बीच मुख्य अंतर यह है कि J2ObjC
Objective-C कोड को समझाने के लिए, /*-[
और ]-*/
. इस सुविधा को OCNI (Objective-C) कहा जाता है
नेटिव इंटरफ़ेस ) का इस्तेमाल करता है.
यहां JRE एम्युलेशन लाइब्रेरी के java.lang.System
के वर्शन का उदाहरण दिया गया है:
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 डायरेक्टिव भी जोड़े जा सकें का इस्तेमाल भी कर सकते हैं. हालांकि, सिर्फ़ नेटिव कोड के लिए ज़रूरी सभी इंपोर्ट अलग से जोड़ा गया. इंपोर्ट जोड़ने के लिए, Java सोर्स फ़ाइल में पहली क्लास के ऊपर ओसीएनआई सेक्शन जोड़ें और वहां इंपोर्ट की जानकारी दें; उदाहरण के लिए:
package my.project;
/*-[
#import "java/lang/NullPointerException.h"
]-*/
public class Test {
native void test() /*-[
@throw [[JavaLangNullPointerException alloc] init];
]-*/;
}
ऊपर दिए गए उदाहरण में इंपोर्ट करना ज़रूरी है, क्योंकि सिर्फ़ इसी जगह का रेफ़रंस दिया गया है नेटिव कोड.
नेटिव ब्लॉक
क्लास के अंदर, J2ObjC एनसीएनआई ब्लॉक को स्कैन करता है. इन ब्लॉक को अनुवाद की गई फ़ाइल, अनुवाद की गई क्लास के सदस्यों के उसी क्रम में होगी. यहां एक उदाहरण दिया गया है:
/*-[
static void log(NSString *msg) {
NSLog(@"%@", msg);
}
]-*/;
इस C फ़ंक्शन को, ऐसे किसी भी नेटिव मेथड से शुरू किया जा सकता है जिसका एलान इस ओसीएनआई ब्लॉक के बाद किया गया हो.
इस ओसीएनआई ब्लॉक का एक खास वैरिएंट, जनरेट किए गए हेडर में कोड शामिल करता है
.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_
. पीछे वाला प्रत्यय, तरीकों के टकराव से बचा जाता है
.
ध्यान दें कि रिज़र्व किए गए नाम वाले फ़ील्ड में दो अंडरस्कोर होंगे. उदाहरण के लिए, "आईडी" नाम का फ़ील्ड Java में कानूनी तौर पर काम करता है, लेकिन Objective-C में नहीं. अनुवाद किए जाने पर, उस फ़ील्ड को "id__" नाम दिया जाएगा. इसलिए, कृपया जनरेट की गई फ़ाइलों की जांच करें, अगर "ऐसा कोई क्षेत्र नहीं" होता है कंपाइलर गड़बड़ियां.
किसी ऑब्जेक्ट इंस्टेंस फ़ील्ड में लिखने के लिए, JSNIExample_set_myInstanceField(string)
का इस्तेमाल करें
कोई स्टैटिक फ़ील्ड पढ़ें: JSNIExample_get_myStaticField()
एक स्टैटिक फ़ील्ड लिखें: JSNIExample_set_myStaticField(value)
J2ObjC और GWT
अलग-अलग डीलिमिटर चुने गए हैं, ताकि अगली J2ObjC रिलीज़ में, GWT JSNI टिप्पणियां (पहले इन्हीं डेलिमिटर का इस्तेमाल GWT के तौर पर किया जाता था). इसका मतलब है कि एक Java स्रोत ऐसी नेटिव मेथड हैं जिनमें Objective-C, GWT, और Android (जेएनआई के ज़रिए) लागू किया जाता है:
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++ फ़ाइल में लागू किया गया है. Java की क्लास में मौजूद सभी ओसीएनआई टिप्पणियां तब हटा दी जाती हैं, जब Android या किसी भी अन्य Java प्लैटफ़ॉर्म के लिए javac के ज़रिए कंपाइल करके दिए जाते हैं.