নেটিভ পদ্ধতি লেখা

J2ObjC জাভা নেটিভ পদ্ধতিতে অবজেক্টিভ-সি এম্বেড করা সমর্থন করে, যেভাবে GWT-এর JSNI জাভাস্ক্রিপ্ট এম্বেডিং সমর্থন করে তার অনুরূপ। J2ObjC এম্বেডিং এবং GWT-এর মধ্যে প্রধান পার্থক্য হল J2ObjC অবজেক্টিভ-সি কোড বর্ণনা করতে /*-[ এবং ]-*/ ব্যবহার করে। GWT এর JSNI থেকে নিজেকে আলাদা করার জন্য এই সুবিধাটিকে OCNI (অবজেক্টিভ-সি নেটিভ ইন্টারফেস) বলা হয়।

এখানে 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 জাভা কোডটি স্ক্যান করে যা তার নির্ভরতার জন্য #import নির্দেশিকা যোগ করতে অনুবাদ করা হচ্ছে, সেইসাথে ফাউন্ডেশন ফ্রেমওয়ার্ক আমদানি করে। যাইহোক, শুধুমাত্র নেটিভ কোড দ্বারা প্রয়োজনীয় যেকোন আমদানি আলাদাভাবে যোগ করতে হবে। আমদানি যোগ করতে, জাভা সোর্স ফাইলে প্রথম শ্রেণীর উপরে একটি 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);
    }
  ]-*/;

এই OCNI ব্লকের পরে ঘোষিত যে কোনও নেটিভ পদ্ধতি থেকে এই C ফাংশনটি চালু করা যেতে পারে।

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

নেটিভ কোড থেকে ক্ষেত্র অ্যাক্সেস করা

একটি উদাহরণ ক্ষেত্র পড়তে, হয় myInstanceField_ অথবা self->myInstanceField_ ব্যবহার করুন। ট্রেলিং প্রত্যয়টি একই নামের পদ্ধতির সাথে সংঘর্ষ এড়ায়।

মনে রাখবেন যে ক্ষেত্রগুলির নাম সংরক্ষিত আছে সেগুলির দুটি আন্ডারস্কোর থাকবে৷ উদাহরণস্বরূপ, "id" নামের একটি ক্ষেত্র জাভাতে বৈধ, কিন্তু উদ্দেশ্য সি-তে নয়। অনুবাদ করা হলে, সেই ক্ষেত্রটিকে "id__" নাম দেওয়া হবে। অতএব, অনুগ্রহ করে জেনারেট করা ফাইলগুলি পরীক্ষা করুন যদি "কোন-অমুক-ক্ষেত্র" কম্পাইলার ত্রুটি না থাকে।

একটি অবজেক্ট ইনস্ট্যান্স ফিল্ডে লিখতে, JSNIExample_set_myInstanceField(string) ব্যবহার করুন

একটি স্ট্যাটিক ক্ষেত্র পড়ুন: JSNIExample_get_myStaticField()

একটি স্ট্যাটিক ক্ষেত্র লিখুন: JSNIExample_set_myStaticField(value)

J2ObjC এবং GWT

বিভিন্ন ডিলিমিটার বেছে নেওয়া হয়েছে যাতে পরবর্তী J2ObjC রিলিজে, GWT JSNI মন্তব্য উপেক্ষা করা হয় (আগে একই ডিলিমিটারগুলি GWT হিসাবে ব্যবহার করা হত)। এর মানে হল যে একটি একক জাভা উৎসের নেটিভ পদ্ধতি থাকতে পারে যার মধ্যে অবজেক্টিভ-সি, জিডব্লিউটি এবং অ্যান্ড্রয়েড (জেএনআই-এর মাধ্যমে) বাস্তবায়ন রয়েছে:

  static native void log(String text) /*-{ // left-brace for JavaScript
    console.log(text);
  }-*/ /*-[                                // left-bracket for Objective-C
     NSLog(@"%@", text);
  ]-*/;

J2ObjC এবং Android

J2ObjC এবং অ্যান্ড্রয়েড নেটিভ পদ্ধতি বাস্তবায়ন "শুধু কাজ করে", কারণ অ্যান্ড্রয়েড নেটিভ পদ্ধতিগুলি একটি পৃথক JNI C বা C++ ফাইলে প্রয়োগ করা হয়। Android বা অন্য কোনো Java প্ল্যাটফর্মের জন্য javac দ্বারা সংকলিত হলে Java ক্লাসে যেকোনো OCNI মন্তব্য মুছে ফেলা হয়।