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 ディレクティブを追加します。 Foundation フレームワークのインポートと 同義ですただし、ネイティブ コードでのみ必要なインポートは、 個別に追加されます。インポートを追加するには、Java ソースファイルの最初のクラスの上に OCNI セクションを追加します。 そこでインポートを指定します次に例を示します。
package my.project;
/*-[
#import "java/lang/NullPointerException.h"
]-*/
public class Test {
native void test() /*-[
@throw [[JavaLangNullPointerException alloc] init];
]-*/;
}
上記の例では、その型が参照されている唯一の場所であるため、import が必要です。 ネイティブコードの記述が必要です。
ネイティブ ブロック
クラス本体内で、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__」という名前が付けられます。生成されたファイルで、 そのようなフィールドがない場合にエラーになります。
オブジェクト インスタンス フィールドに書き込むには、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 によってコンパイルされます。