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
.
Koleksi | Tanda Link | Deskripsi |
---|---|---|
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.
Koleksi | Tanda Link | Deskripsi |
---|---|---|
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
.
Koleksi | Tanda Link | Deskripsi |
---|---|---|
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:
Koleksi | Tanda Link | Deskripsi |
---|---|---|
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 Link
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
};