네이티브 메서드 작성

J2ObjC는 Java 네이티브 메서드에 Objective-C를 삽입하는 기능을 지원하며 GWT의 JSNI는 JavaScript 삽입입니다. J2ObjC 임베딩과 GWT의 주요 차이점은 J2ObjC가 Objective-C 코드를 설명하는 /*-[]-*/ 이 기능을 OCNI (Objective-C)라고 합니다. 네이티브 인터페이스).를 사용하여 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 함수는 이 OCNI 블록 이후에 선언된 모든 네이티브 메서드에서 호출할 수 있습니다.

이 OCNI 블록의 특수한 변형이 생성된 헤더에 코드를 대신 삽입합니다. 다음의 .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_ 후행 접미사는 메서드와의 충돌을 방지합니다. 생성할 수 있습니다.

예약된 이름이 있는 필드에는 밑줄 2개가 표시됩니다. 예를 들어 'id'라는 필드 는 Java에서는 허용되지만 Objective C에서는 허용되지 않습니다. 번역할 때 해당 필드의 이름은 '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++ 파일에 구현되어 있습니다. Java 클래스의 모든 OCNI 주석은 Android 또는 기타 Java 플랫폼용 javac로 컴파일됩니다.