Yerel Yöntemler Yazma

J2ObjC, şuna çok benzer şekilde, Java'nın yerel yöntemlerine Objective-C'nin yerleştirilmesini destekler: GWT'nin JSNI desteği JavaScript yerleştirme. J2ObjC yerleştirme ile GWT'ler arasındaki temel fark, J2ObjC'nin Objective-C kodunu tanımlamak için /*-[ ve ]-*/. Bu tesis OCNI (Objective-C) olarak adlandırılır. Yerel Arayüz) kullanarak kendini GWT'nin JSNI'sinden ayırt edebilir.

JRE emülasyon kitaplığının java.lang.System sürümündeki 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, çevrilmiş olan Java kodunu tarayarak bağımlılıkları için #import direktiflerini de ekler. temel çerçeveyi ithal edecek şekilde açıklayacağım. Bununla birlikte, yalnızca yerel kod tarafından gereken içe aktarma işlemlerinin ayrı olarak eklenir. İçe aktarma eklemek için Java kaynak dosyasında ilk sınıfın üstüne 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 içe aktarma işlemi gereklidir çünkü bu türe referans verilen tek yer yerel koda karşılık gelir.

Yerel Bloklar

J2ObjC, sınıf gövdesinde OCNI bloklarını tarar. Bu bloklar, değişiklik yapılmadan çevrilmiş sınıf üyelerine göre aynı konumda gösterilir. Aşağıda bununla ilgili bir örnek verilmiştir:

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

Bu C işlevi, bu OCNI bloğundan sonra tanımlanan herhangi bir yerel yöntemden çağrılabilir.

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

Yerel Kod'dan 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);
]-*/;

Yerel Kod'daki alanlara erişme

Bir örnek alanını okumak için myInstanceField_ veya self->myInstanceField_. İzleyen sonek, yöntemler arasında çakışma olmasını önler aynı ada sahip.

Ayrılmış adlara sahip alanlarda iki alt çizgi olacağını unutmayın. Örneğin, "id" adlı bir alan dili Java'da yasaldır, ancak Hedef C'de geçerli değildir. Çevrildiğinde bu alan "id__" olarak adlandırılır. Bu nedenle, oluşturulan dosyalara göz atın. "böyle-alanlar yok" derleyici hatalarının sayısı.

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

Bir statik alan okuyun: 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 yok sayıldı (daha önce GWT olarak aynı ayırıcılar kullanılıyordu). Bu, tek bir Java kaynağının Objective-C, GWT ve Android (JNI aracılığıyla) uygulamaları olan yerel yöntemlere sahip olmalıdır:

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

J2ObjC ve Android

J2ObjC ve Android yerel yöntemleri "her zaman çalışır", çünkü Android'de yerel yöntemler ayrı bir JNI C veya C++ dosyasında uygulanması gerekir. Java sınıflarındaki OCNI yorumları şu durumlarda kaldırılır: Android veya başka bir Java platformu için javac tarafından derlenir.