Yerel Yöntemler Yazma

J2ObjC, GWT'nin JSNI'sinin JavaScript yerleştirmeyi desteklemesine çok benzer şekilde, Objective-C'nin Java yerel yöntemlerine yerleştirilmesini destekler. J2ObjC yerleştirme ile GWT'ler arasındaki temel fark, J2ObjC'nin Objective-C kodunu tanımlamak için /*-[ ve ]-*/ kullanmasıdır. Bu tesis, GWT'nin JSNI'sinden ayırt edilmesi için OCNI (Objective-C Native Interface) olarak adlandırılır.

JRE emülasyon kitaplığının java.lang.System sürümünden bir örneği burada bulabilirsiniz:

  public static native long currentTimeMillis() /*-[
    // Use NSDate
    return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
  ]-*/;

J2ObjC, yöntem gövdesini oluşturmak için yorumu ayırıcılar çıkarılarak kopyalar:

  + (long long int)currentTimeMillis {
    // Use NSDate
    return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
  }

Yerel İçe Aktarmalar

J2ObjC, çevrilen Java kodunu tarayarak bağımlılıkları için #import yönergeleri ekler ve temel çerçeveyi içe aktarır. Bununla birlikte, yalnızca yerel kod için gereken tüm içe aktarma işlemlerinin ayrı olarak eklenmesi gerekir. İçe aktarma işlemi eklemek için Java kaynak dosyasındaki ilk sınıfın üst kısmına bir OCNI bölümü ekleyin ve içe aktarma işlemlerini burada belirtin. Örneğin:

  package my.project;

  /*-[
  #import "java/lang/NullPointerException.h"
  ]-*/

  public class Test {
    native void test() /*-[
      @throw [[JavaLangNullPointerException alloc] init];
    ]-*/;
  }

Yukarıdaki örnekte türe başvurulan tek yer yerel kodda olduğundan içe aktarma işlemi gereklidir.

Yerel Engellemeler

J2ObjC, bir sınıf gövdesinde OCNI bloklarını tarar. Bu bloklar, değiştirilen dosyaya değiştirilmeden, çevrilmiş sınıf üyelerine göre aynı konuma eklenir. Aşağıda bir örnek verilmiştir:

  /*-[
    static void log(NSString *msg) {
      NSLog(@"%@", msg);
    }
  ]-*/;

Bu C işlevi, bu OCNI blokundan sonra bildirilen herhangi bir yerel yöntemden çağrılabilir.

Bu OCNI bloğunun özel bir varyantı, .m dosyası yerine oluşturulan başlığa kod ekler: /*-HEADER[...]

Yerel Koddan Java Yöntemlerini çağırma

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);
]-*/;

Alanlara Yerel Koddan erişme

Bir örnek alanını okumak için myInstanceField_ veya self->myInstanceField_ kullanın. Sondaki sonek, aynı ada sahip yöntemlerle çakışmayı önler.

Ayrılmış adları olan alanlarda iki alt çizgi olacağını unutmayın. Örneğin, "id" adlı bir alan Java'da yasaldır ancak Hedef C'de geçerli değildir. Çevrildiğinde, bu alan "id__" olarak adlandırılır. Bu nedenle, "no-such-field" derleyici hataları varsa, lütfen oluşturulan dosyaları kontrol edin.

Bir nesne örneği alanına yazmak için JSNIExample_set_myInstanceField(string) işlevini kullanın

Statik bir alanı oku: JSNIExample_get_myStaticField()

Statik bir alan yazın: JSNIExample_set_myStaticField(value)

J2ObjC ve GWT

Bir sonraki J2ObjC sürümünde GWT JSNI yorumlarının yoksayılması için farklı ayırıcılar seçildi (önceden GWT olarak aynı sınırlayıcılar kullanılıyordu). Bu, tek bir Java kaynağının Objective-C, GWT ve Android (JNI aracılığıyla) uygulamalarına sahip yerel yöntemlere sahip olabileceği anlamına gelir:

  static native void log(String text) /*-{ // left-brace for JavaScript
    console.log(text);
  }-*/ /*-[                                // left-bracket for Objective-C
     NSLog(@"%@", text);
  ]-*/;

J2ObjC ve Android

Android yerel yöntemler ayrı bir JNI C veya C++ dosyasında uygulandığından J2ObjC ve Android yerel yöntem uygulamaları "sadece çalışır". Java sınıflarındaki OCNI yorumları, Android veya başka bir Java platformu için javac tarafından derlendiğinde kaldırılır.