Viết phương thức gốc

J2ObjC hỗ trợ việc nhúng Objective-C vào các phương thức gốc Java, rất giống với cách JSNI của GWT hỗ trợ tính năng nhúng JavaScript. Điểm khác biệt chính giữa tính năng nhúng J2ObjC và GWT là J2ObjC sử dụng /*-[]-*/ để phân định mã Objective-C. Cơ sở này được gọi là OCNI (Giao diện gốc Objective-C) để phân biệt với cơ sở này với JSNI của GWT.

Dưới đây là ví dụ từ phiên bản java.lang.System của thư viện mô phỏng JRE:

  public static native long currentTimeMillis() /*-[
    // Use NSDate
    return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
  ]-*/;

J2ObjC sao chép nhận xét, trừ các dấu phân cách, để tạo nội dung phương thức:

  + (long long int)currentTimeMillis {
    // Use NSDate
    return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
  }

Nhập dữ liệu gốc

J2ObjC quét mã Java đang được dịch để thêm lệnh #import cho các phần phụ thuộc, cũng như nhập khung Nền tảng. Tuy nhiên, bạn cần thêm riêng mọi dữ liệu nhập chỉ cần thiết bằng mã gốc. Để thêm lệnh nhập, hãy thêm phần OCNI vào phía trên lớp đầu tiên trong tệp nguồn Java và chỉ định lệnh nhập ở đó; ví dụ:

  package my.project;

  /*-[
  #import "java/lang/NullPointerException.h"
  ]-*/

  public class Test {
    native void test() /*-[
      @throw [[JavaLangNullPointerException alloc] init];
    ]-*/;
  }

Ví dụ trên cần nhập dữ liệu vì vị trí duy nhất mà loại này được tham chiếu là trong mã gốc.

Khối gốc

Trong một lớp nội dung, J2ObjC quét tìm các khối OCNI. Các khối này được thêm vào tệp đã dịch mà không sửa đổi, ở cùng vị trí so với các thành phần của lớp đã dịch. Ví dụ:

  /*-[
    static void log(NSString *msg) {
      NSLog(@"%@", msg);
    }
  ]-*/;

Hàm C này có thể được gọi từ bất kỳ phương thức gốc nào được khai báo sau khối OCNI này.

Một biến thể đặc biệt của khối OCNI này sẽ chèn mã vào tiêu đề đã tạo thay vì tệp .m: /*-HEADER[...]

Gọi phương thức Java từ mã gốc

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

Truy cập vào các trường từ Mã gốc

Để đọc một trường thực thể, hãy sử dụng myInstanceField_ hoặc self->myInstanceField_. Hậu tố theo sau giúp tránh xung đột với các phương thức có cùng tên.

Lưu ý rằng những trường có tên dành riêng sẽ có hai dấu gạch dưới. Ví dụ: một trường có tên "id" là hợp lệ trong Java nhưng không hợp lệ trong Mục tiêu C. Khi được dịch, trường đó sẽ có tên là "id__". Do đó, vui lòng kiểm tra các tệp đã tạo nếu có lỗi trình biên dịch "no-such-field" (không có trường như vậy).

Để ghi vào một trường thực thể đối tượng, hãy sử dụng JSNIExample_set_myInstanceField(string)

Đọc một trường tĩnh: JSNIExample_get_myStaticField()

Viết một trường tĩnh: JSNIExample_set_myStaticField(value)

J2ObjC và GWT

Các dấu phân cách khác nhau được chọn sao cho trong bản phát hành J2ObjC tiếp theo, ghi chú GWT JSNI sẽ bị bỏ qua (trước đây, các dấu phân tách tương tự được dùng làm GWT). Điều này có nghĩa là một nguồn Java có thể có các phương thức gốc triển khai Objective-C, GWT và Android (thông qua JNI):

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

J2ObjC và Android

Các phương thức triển khai phương thức gốc J2ObjC và Android "chỉ hoạt động", vì các phương thức gốc Android được triển khai trong một tệp JNI C hoặc C++ riêng biệt. Mọi nhận xét OCNI trong lớp Java đều bị xoá khi biên dịch bằng javac cho Android hoặc bất kỳ nền tảng Java nào khác.