Setelan Link yang Diperlukan

Langkah build link (fase build "Link Binary With Libraries" Xcode) memerlukan flag khusus J2ObjC, yang bervariasi bergantung pada cara aplikasi Anda menggunakan class Java yang telah diterjemahkan. Tanda inti ditetapkan oleh skrip command line j2objcc, tetapi perlu ditentukan saat membangun dengan Xcode.

Library SDK

Library ini diperlukan oleh implementasi JRE J2ObjC. Kegagalan menyertakan library ini akan menyebabkan error simbol yang tidak ditentukan dengan nama yang diawali dengan _iconv.

KoleksiTanda LinkDeskripsi
iconv Ikon -l Digunakan oleh jre_core untuk encoding dan decoding karakter.

Library ini digunakan oleh implementasi JRE J2ObjC dan mungkin perlu ditautkan ke aplikasi Anda.

KoleksiTanda LinkDeskripsi
zip -l z Digunakan oleh java.util.zip. Anda harus menyertakan ini jika menautkan jre_zip.
Keamanan -Keamanan framework Wajib jika menautkan jre_security.

Jalur Penelusuran Koleksi

Distribusi J2ObjC mencakup beberapa library statis. Untuk menggunakannya, project Anda harus memberi tahu linker di mana harus menemukannya.

Umumnya, jalur penelusuran library harus menyertakan _$(j2objcdistribution)/lib, dengan variabel _$(j2objcdistribution) adalah jalur ke salinan lokal J2ObjC Anda. Misalnya, jika Anda mengekstrak file arsip rilis J2ObjC ke "/usr/local/", jalur ini akan menjadi "/usr/local/j2objc".

Penting: Jangan benar-benar menggunakan _$(j2objcdistribution) dalam project; selalu tentukan jalur sebenarnya tempat Anda menginstal J2ObjC.

Jika Anda membuat J2ObjC dari salinan kode sumbernya, _$(j2objcdistribution) adalah direktori "j2objc/dist/" salinan Anda. Direktori ini tidak akan ada sampai Anda membuat J2ObjC dengan make dist.

Xcode: Jalur Penelusuran Library

Perbarui Jalur Penelusuran Library target aplikasi dengan menambahkan _$(j2objcdistribution)/lib (sekali lagi, gunakan jalur sebenarnya).

Library JRE

Library ini mengimplementasikan class yang ditentukan oleh emulasi JRE J2ObjC.

Catatan: library libjre_core.a berisi class dari sebagian besar library subset lainnya. Cara yang direkomendasikan untuk mengurangi ukuran aplikasi adalah dengan mulai menautkan aplikasi dengan -l jre_core, lalu menambahkan library subset yang menyelesaikan simbol yang hilang. Misalnya, class java.io yang paling umum digunakan berada di libjre_core.a, jadi hanya sertakan library libjre_io.a jika ada error simbol yang belum terselesaikan, yang namanya diawali dengan JavaIo.

KoleksiTanda LinkDeskripsi
libjre_core.a {i>-l jre_core<i} Set minimum class yang diperlukan untuk emulasi JRE J2ObjC, yang direferensikan oleh semua file sumber yang dihasilkan. Jika sumber Java Anda yang telah diterjemahkan mereferensikan dukungan JRE untuk hal-hal seperti networking, XML, SQL, dll., library tambahan (di bawah) juga harus ditautkan.
libjre_beans.a -l jre_beans Semua class dari paket java.beans. Tidak semua class Java Beans disertakan, karena banyak yang hanya digunakan oleh aplikasi Swing dan AWT.
libjre_channels.a -l jre_channels (saluran jre) Beberapa class dari paket java.nio.channels dan java.nio.channels.spi.
libjre_concurrent.a -l jre_serentak Beberapa class dari paket java.util.concurrent, java.util.concurrent.atomic dan java.util.concurrent.locks.
libjre_icu.a {i>-l jre_icu<i} Beberapa class dari android.icu untuk mendukung zona waktu (terutama untuk mengaktifkan java.time).
libjre_io.a -l jre_io Beberapa class (lebih jarang digunakan) dari paket java.io.
libjre_net.a -l jre_net Beberapa class dalam paket java.net. Namun, class java.net.URLClassLoader berada di jre_security, sedangkan class javax.net dan javax.net.ssl berada di jre_ssl.
libjre_security.a -l jre_security Sebagian besar class dalam paket java.security (beberapa di antaranya berada di jre_core), serta class dalam paket java.security.*, javax.crypto.*, dan javax.security.*. Jika menautkan aplikasi ini, Anda juga harus menautkan framework Keamanan iOS. (lihat Library SDK)
libjre_sql.a -l jre_sql Semua class dalam paket java.sql.
libjre_ssl.a {i>-l jre_ssl<i} Semua class dalam paket javax.net dan javax.net.ssl.
libjre_time.a {i>-l jre_time<i} Semua class dalam paket java.time.
libjre_util.a {i>-l jre_util<i} Beberapa class dari paket java.util, serta paket java.util.logging. Sebagian besar class java.util berada di jre_core, jadi hanya sertakan library ini jika ada error simbol JavaUtil* yang belum terselesaikan (simbol JavaUtilConcurrent* berada di library jre_concurrent).
libjre_xml.a {i>-l jre_xml<i} Semua class dari paket terkait XML, termasuk javax.xml.*, org.w3c.dom.*, dan org.xml.sax.*.
libjre_zip.a {i>-l jre_zip<i} Semua class dari paket java.util.zip dan java.util.jar. Jika menautkan ini, Anda juga perlu menautkan library zip SDK. (lihat Library SDK)

libjre_emul.a (-l jre_emul)

Library jre_emul berisi semua class yang disertakan dalam emulasi JRE J2ObjC. Jika aplikasi ditautkan dengan jre_emul, tidak ada library jre_* lainnya yang harus disertakan, atau penaut akan melaporkan error simbol duplikat. Hal ini dikarenakan jre_emul menyertakan semua class yang ditentukan dalam library lain tersebut.

Library J2ObjC Lainnya

Library Java dan class utilitas Android ini disertakan dalam distribusi J2ObjC sebagai library statis:

KoleksiTanda LinkDeskripsi
libguava.a -l jambu biji Guava: Library Google Core untuk Java
libjavax_inject.a {i>-l javax_inject<i} Library anotasi injeksi dependensi JSR-330.
libjson.a {i>-l json<i} Library pertukaran data JSON. Ini adalah JSON versi Android, yang sedikit berbeda dari implementasi lain.
libjsr305.a -l jsr305 Anotasi JSR-305 untuk library deteksi kerusakan software.
libjunit.a {i>-l junit -ObjC<i} Framework pengujian JUnit.
libmockito.a -l mockito -ObjC Framework tiruan Mockito untuk pengujian unit di Java.
libprotobuf_runtime.a {i>-l protobuf_runtime<i} Runtime Google Protocol Buffer, yang dioptimalkan untuk aplikasi J2ObjC. Aplikasi yang menggunakan protobuf J2ObjC harus mengompilasi file proto mereka dengan j2objc_protoc.
libandroid_util.a {i>-l android_util<i} Library `android_util` berisi subset kecil class utilitas Android API. Library ini tidak dimaksudkan untuk memberikan emulasi bagi lingkungan Android, melainkan sekadar cara untuk berbagi class yang berguna seperti `android.util.Log`.

Flag -ObjC sering digunakan saat menautkan aplikasi iOS, tetapi hanya diperlukan saat class dan kategori Objective C perlu dimuat secara dinamis dari library statis. Flag ini menyebabkan semua class di semua library statis yang tertaut disertakan dalam aplikasi, baik benar-benar digunakan maupun tidak. Oleh karena itu, sebaiknya aplikasi yang menggunakan J2ObjC hanya ditautkan dengan flag -ObjC saat class gagal dimuat saat runtime (salah satu gejalanya adalah saat JavaLangClassNotFoundException ditampilkan).

Framework pengujian JUnit dan Mockito sangat bergantung pada refleksi, jadi aplikasi pengujian yang menggunakannya harus terhubung dengan -ObjC.

Alternatif untuk menautkan seluruh library statis agar beberapa class dapat dimuat secara dinamis adalah dengan mereferensikan class tersebut secara statis. Di Java, hal ini dapat dilakukan dalam blok penginisialisasi statis; berikut ini contoh dari class IosSecurityProvider J2ObjC:

  // 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
  };