ネイティブ メソッドの記述

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 によってコンパイルされます。