स्थानीय तरीकों को लिखना

J2ObjC, Java नेटिव तरीकों में Objective-C को एम्बेड करने की सुविधा देता है. यह ठीक वैसे ही काम करता है जैसे GWT की JSNI, JavaScript एम्बेड करने की सुविधा के साथ काम करता है. J2ObjC एम्बेडिंग और GWT के बीच मुख्य अंतर यह है कि J2ObjC, ऑब्जेक्टिव-सी कोड को साफ़ करने के लिए /*-[ और ]-*/ का इस्तेमाल करता है. इस सुविधा को OCNI (ऑब्जेक्टिव-सी नेटिव इंटरफ़ेस) कहा जाता है, ताकि वह GWT के JSNI से अलग दिख सके.

यहां 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 सोर्स फ़ाइल की फ़र्स्ट क्लास के ऊपर एक 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 फ़ंक्शन को, ओसीएनआई ब्लॉक के बाद बताए गए किसी भी नेटिव तरीके से शुरू किया जा सकता है.

इस ओसीएनआई ब्लॉक का एक खास वैरिएंट, जनरेट किए गए हेडर में .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_ का इस्तेमाल करें. पीछे लगने वाले सफ़िक्स से, दोनों में एक जैसे नाम वाले अलग-अलग तरीकों के टकराव से बचा जा सकता है.

ध्यान दें कि रिज़र्व किए गए नाम वाले फ़ील्ड में दो अंडरस्कोर होंगे. उदाहरण के लिए, "id" नाम का फ़ील्ड Java में कानूनी है, लेकिन ऑब्जेक्ट सी में नहीं. अनुवाद किए जाने के बाद, उस फ़ील्ड का नाम "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++ फ़ाइल में लागू किया जाता है. Android या किसी दूसरे Java प्लैटफ़ॉर्म के लिए, javac से कंपाइल करते समय, Java क्लास में मौजूद ओसीएनआई टिप्पणियों को हटा दिया जाता है.