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

J2ObjC hỗ trợ nhúng Mục tiêu-C vào các phương thức gốc Java, rất giống với cách Hỗ trợ JSNI của GWT Nhúng JavaScript. Sự khác biệt chính giữa nhúng J2ObjC và GWT là J2ObjC sử dụng /*-[]-*/ để mô tả mã GOAL-C. Cơ sở này có tên là OCNI (Mục tiêu-C) Giao diện gốc) để phân biệt 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 tá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 mã gốc

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

  package my.project;

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

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

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

Khối gốc

Trong một nội dung lớp, J2ObjC quét tìm các khối OCNI. Các khối này được thêm vào mà chưa sửa đổi tệp đã dịch, ở cùng vị trí so với các thành viên trong 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 của 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 các trường từ Mã gốc

Để đọc 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 các trường có tên dành riêng sẽ có hai dấu gạch dưới. Ví dụ: trường có tên "id" là hợp pháp trong Java, nhưng không hợp pháp 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 không có trường nào như vậy trình biên dịch.

Để 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 tách khác nhau đã được chọn để trong bản phát hành J2ObjC tiếp theo, nhận xét của GWT JSNI sẽ là bị bỏ qua (trước đây, các dấu phân cách tương tự được sử dụng như 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 có triển khai Target-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

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 là được triển khai trong 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 được biên dịch bởi javac dành cho Android hoặc bất kỳ nền tảng Java nào khác.