Gerekli Bağlantı Ayarları

Bağlantı oluşturma adımı (Xcode'un "Link Binary with Libraries" derleme aşaması), uygulamanızın çevrilmiş Java sınıflarını nasıl kullandığına bağlı olarak değişen J2ObjC'ye özel işaretler gerektirir. Temel işaretler, j2objcc komut satırı komut dosyası tarafından ayarlanır ancak Xcode ile derleme sırasında belirtilmesi gerekir.

SDK Kitaplıkları

Bu kitaplık, J2ObjC'nin JRE uygulaması için gereklidir. Bu kitaplığın dahil edilmemesi, _iconv ile başlayan adlarda tanımlanmamış sembol hatalarına neden olur.

KitaplıkBağlantı İşaretiAçıklama
ikon -l ikonu Karakter kodlama ve kod çözme işlemleri için jre_core tarafından kullanılır.

Bu kitaplıklar, J2ObjC'nin JRE uygulaması tarafından kullanılır ve uygulamanıza bağlanması gerekebilir.

KitaplıkBağlantı İşaretiAçıklama
zip -l z java.util.zip tarafından kullanılır. jre_zip kodunu bağlıyorsanız bunu eklemeniz gerekir.
Güvenlik -çerçeve Güvenliği jre_security bağlanıyorsa gereklidir.

Kitaplık Arama Yolu

J2ObjC'nin dağıtımı çeşitli statik kitaplıklar içerir. Bunları kullanmak için projenizin bağlayıcıya bunları nerede bulacağını söylemesi gerekir.

Genel olarak, kitaplık arama yolunun _$(j2objcdistribution)/lib içermesi gerekir. Burada, _$(j2objcdistribution) değişkeni, yerel J2ObjC kopyanızın yoludur. Örneğin, bir J2ObjC sürüm arşivi dosyasını "/usr/local/" konumuna çıkarırsanız bu yol "/usr/local/j2objc" olur.

Önemli: Projenizde _$(j2objcdistribution) kodunu gerçekten kullanmayın; J2ObjC'yi yüklediğiniz gerçek yolu her zaman belirtin.

J2ObjC'yi kaynak kodunun bir kopyasından derlerseniz _$(j2objcdistribution), kopyanızın "j2objc/dist/" dizini olur. Bu dizin, make dist ile J2ObjC derlenene kadar mevcut olmaz.

Xcode: Kitaplık Arama Yolları

_$(j2objcdistribution)/lib ekleyerek uygulama hedefinin Kitaplık Arama Yolları'nı güncelleyin (yine gerçek yolu kullanın).

JRE Kitaplıkları

Bu kitaplıklar, J2ObjC'nin JRE emülasyonu tarafından tanımlanan sınıfları uygular.

Not: libjre_core.a kitaplığı, diğer alt küme kitaplıklarının çoğundan sınıflar içerir. Uygulama boyutunu küçültmenin önerilen yolu, uygulamayı -l jre_core ile bağlamaya başlamak, ardından eksik sembolleri çözen alt küme kitaplıklarını eklemektir. Örneğin, en sık kullanılan java.io sınıfları libjre_core.a alt bölgesindedir. Bu nedenle, libjre_io.a kitaplığını yalnızca adları JavaIo ile başlayan çözülmemiş simge hataları varsa dahil edin.

KitaplıkBağlantı İşaretiAçıklama
libjre_core.a -l jre_core Oluşturulan tüm kaynak dosyalar tarafından başvurulan, J2ObjC'nin JRE emülasyonu için gereken minimum sınıf grubu. Çevrilmiş Java kaynaklarınız ağ, XML, SQL vb. için JRE desteğine referans veriyorsa aşağıdaki ek kitaplıkların da (aşağıda) bağlanması gerekir.
libjre_beans.a -l jre_beans java.beans paketindeki tüm sınıflar. Java Beans sınıflarının çoğu yalnızca Swing ve AWT uygulamaları tarafından kullanıldığından tüm Java Beans sınıfları dahil edilmez.
libjre_channels.a -l jre_kanalları java.nio.channels ve java.nio.channels.spi paketlerinden çeşitli sınıflar.
libjre_concurrent.a -l jre_concurrent java.util.concurrent, java.util.concurrent.atomic ve java.util.concurrent.locks paketlerinden çeşitli sınıflar.
libjre_icu.a -i jre_icu Saat dilimlerini desteklemek için (esas olarak java.time özelliğini etkinleştirmek için) android.icu ile başlayan çeşitli sınıflar.
libjre_io.a -l_jre_io java.io paketinden birkaç (daha seyrek kullanılan) sınıf.
libjre_net.a -l jre_net java.net paketinde çeşitli sınıflar bulunur. Ancak java.net.URLClassLoader sınıfı jre_security, javax.net ve javax.net.ssl sınıfları ise jre_ssl konumundadır.
libjre_security.a -l jre_security java.security paketindeki çoğu sınıf (birkaçı jre_core ürünündedir) ve java.security.*, javax.crypto.* ve javax.security.* paketlerindeki sınıflar. Bunu bağlarsanız iOS Güvenlik çerçevesini de bağlamanız gerekir. (SDK Kitaplıkları'na bakın)
libjre_sql.a -l jre_sql java.sql paketindeki tüm sınıflar.
libjre_ssl.a -l jre_ssl javax.net ve javax.net.ssl paketlerindeki tüm sınıflar.
libjre_time.a -l jre_time java.time paketindeki tüm sınıflar.
libjre_util.a -l jre_util java.util paketinden çeşitli sınıflar ve java.util.logging paketi. Ancak java.util sınıfının çoğu jre_core kategorisindedir. Dolayısıyla bu kitaplığı yalnızca çözülmemiş JavaUtil* sembol hataları varsa ekleyin (JavaUtilConcurrent* simgeleri jre_concurrent kitaplığında bulunuyor).
libjre_xml.a -l jre_xml javax.xml.*, org.w3c.dom.* ve org.xml.sax.* dahil olmak üzere XML ile ilgili paketlerdeki tüm sınıflar.
libjre_zip.a -l jre_zip java.util.zip ve java.util.jar paketlerindeki tüm sınıflar. Bunu bağlarsanız SDK zip kitaplığını da bağlamanız gerekir. (SDK Kitaplıkları bölümünü inceleyin)

libjre_emul.a (-l jre_emul)

jre_emul kitaplığı, J2ObjC'nin JRE emülasyonuna dahil edilen tüm sınıfları içerir. Bir uygulama jre_emul ile bağlantılıysa diğer jre_* kitaplıklarının hiçbiri dahil edilmemelidir. Aksi takdirde, bağlayıcı yinelenen simge hataları bildirir. Bunun nedeni, jre_emul ürününün bu diğer kitaplıklarda tanımlanan tüm sınıfları içermesidir.

Diğer J2ObjC Kitaplıkları

Aşağıdaki Java kitaplıkları ve Android util sınıfları, J2ObjC dağıtımına statik kitaplık olarak dahil edilir:

KitaplıkBağlantı İşaretiAçıklama
libguava.a -l guava Guava: Java için Google Core Kitaplıkları
libjavax_inject.a -l javax_inject JSR-330 bağımlılık ekleme ek açıklama kitaplığı.
libjson.a -l json JSON veri değişim kitaplığı. Bu, JSON'un Android sürümüdür ve diğer uygulamalardan biraz farklıdır.
libjsr305.a -l jsr305 Yazılım hatası algılama kitaplığı için JSR-305 ek açıklamaları.
libjunit.a -l junit -ObjC JUnit test çerçevesi.
libmockito.a -I Mockito -ObjC Java'daki birim testleri için Mockito aldatma çerçevesi.
libprotobuf_runtime.a -l protobuf_çalışma zamanı J2ObjC uygulamaları için optimize edilmiş bir Google Protocol Buffer çalışma zamanı. J2ObjC protobufs kullanan uygulamalar, proto dosyalarını j2objc_protoc ile derlemelidir.
libandroid_util.a -l android_util "android_util" kitaplığı, Android API yardımcı program sınıflarının küçük bir alt kümesini içerir. Bir Android ortamı için emülasyon sağlamak amacıyla değil, "android.util.Log" gibi yararlı sınıfları paylaşmanın bir yoludur.

-ObjC işareti, iOS uygulamalarını bağlarken sıkça kullanılır ancak yalnızca Objective C sınıflarının ve kategorilerinin statik kitaplıklardan dinamik olarak yüklenmesi gerektiğinde gereklidir. Bu işaret, bağlantılı tüm statik kitaplıklardaki tüm sınıfların, gerçekten kullanılıp kullanılmadıklarına bakılmaksızın uygulamaya dahil edilmesine neden olur. Bu nedenle, J2ObjC kullanan uygulamaların yalnızca sınıflar çalışma zamanında yüklenemediğinde -ObjC işaretiyle bağlantı vermesi önerilir (semptomlardan biri JavaLangClassNotFoundException atanmasıdır).

JUnit ve Mockito test çerçeveleri büyük ölçüde yansımalara dayalı olduğundan bunları kullanan test uygulamaları -ObjC ile bağlantı oluşturmalıdır.

Birkaç sınıfın dinamik olarak yüklenebilmesi için bütün bir statik kitaplıkta bağlantı oluşturmaya alternatif olarak, söz konusu sınıflara statik olarak referans verebilirsiniz. Java'da bu işlem statik bir başlatıcı bloğunda yapılabilir. Aşağıda J2ObjC'nin IosSecurityProvider sınıfından bir örnek verilmiştir:

  // Reference all dynamically loaded classes, so they are linked into apps.
  @SuppressWarnings("unused")
  private static final Class<?>[] unused = {
    IosCertificateFactory.class,
    IosMD5MessageDigest.class,
    IosRSAKeyFactory.class,
    IosRSAKeyPairGenerator.class,
    IosRSASignature.class,
    IosSecureRandomImpl.class,
    IosSHAMessageDigest.class
  };