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로 컴파일됩니다.