네이티브 메서드 작성

J2ObjC는 GWT의 JSNI가 자바스크립트 삽입을 지원하는 방식과 매우 유사하게 자바 네이티브 메서드에 Objective-C를 삽입하는 방법을 지원합니다. J2ObjC 임베딩과 GWT의 주요 차이점은 J2ObjC가 /*-[]-*/를 사용하여 Objective-C 코드를 나타낸다는 것입니다. 이 기능은 GWT의 JSNI와 구별하기 위해 OCNI (Objective-C 네이티브 인터페이스)라고 합니다.

다음은 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는 변환 중인 자바 코드를 검사하여 종속 항목의 #import 지시어를 추가하고 Foundation 프레임워크를 가져옵니다. 그러나 네이티브 코드에만 필요한 가져오기는 별도로 추가해야 합니다. 가져오기를 추가하려면 자바 소스 파일의 첫 번째 클래스 위에 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로 사용됨). 즉, 단일 자바 소스는 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++ 파일에 구현되므로 '작동'합니다. 자바 클래스의 모든 OCNI 주석은 Android 또는 기타 자바 플랫폼용 javac로 컴파일될 때 삭제됩니다.