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.