Cài đặt liên kết bắt buộc

Bước tạo đường liên kết (giai đoạn xây dựng "Link Binary With Libraries" của Xcode) cần có cờ dành riêng cho J2ObjC, cờ này thay đổi tuỳ thuộc vào cách ứng dụng sử dụng lớp Java đã dịch. Các cờ cốt lõi được đặt bởi tập lệnh dòng lệnh j2objcc, nhưng cần được chỉ định khi xây dựng bằng Xcode.

Thư viện SDK

Quá trình triển khai JRE của J2ObjC bắt buộc phải có thư viện này. Nếu không bao gồm thư viện này, bạn sẽ gặp lỗi biểu tượng không xác định với những tên bắt đầu bằng _iconv.

Thư việnCờ liên kếtNội dung mô tả
biểu tượngv -l iconv Được jre_core sử dụng để mã hoá và giải mã ký tự.

Các thư viện này được dùng trong quá trình triển khai JRE của J2ObjC và có thể cần được liên kết với ứng dụng của bạn.

Thư việnCờ liên kếtNội dung mô tả
zip -l z Được sử dụng trong java.util.zip. Bạn cần phải thêm mã này nếu đang liên kết jre_zip.
Bảo mật Bảo mật khung Bắt buộc nếu bạn liên kết với jre_security.

Đường dẫn tìm kiếm trong thư viện

Bản phân phối của J2ObjC bao gồm một số thư viện tĩnh; để sử dụng các thư viện này, dự án của bạn cần cho trình liên kết biết vị trí tìm các thư viện đó.

Nói chung, đường dẫn tìm kiếm thư viện cần bao gồm _$(j2objcdistribution)/lib, trong đó biến _$(j2objcdistribution) là đường dẫn đến bản sao cục bộ của J2ObjC. Ví dụ: nếu bạn giải nén một tệp lưu trữ bản phát hành J2ObjC thành "/usr/local/", đường dẫn này sẽ là "/usr/local/j2objc".

Lưu ý quan trọng: Không thực sự sử dụng _$(j2objcdistribution) trong dự án của bạn; hãy luôn chỉ định đường dẫn thực tế nơi bạn đã cài đặt J2ObjC.

Nếu bạn tạo J2ObjC từ bản sao mã nguồn, thì _$(j2objcdistribution) sẽ là thư mục "j2objc/dist/" của bản sao đó. Thư mục này sẽ không tồn tại cho đến khi bạn tạo J2ObjC bằng make dist.

Xcode: Đường dẫn tìm kiếm trong thư viện

Cập nhật Đường dẫn tìm kiếm thư viện của mục tiêu ứng dụng bằng cách thêm _$(j2objcdistribution)/lib (một lần nữa, hãy sử dụng đường dẫn thực).

Thư viện JRE

Các thư viện này triển khai các lớp được xác định bằng quy trình mô phỏng JRE của J2ObjC.

Lưu ý: Thư viện libjre_core.a chứa các lớp từ hầu hết các thư viện con khác. Để giảm kích thước ứng dụng, bạn nên bắt đầu liên kết ứng dụng với -l jre_core, sau đó thêm các thư viện tập hợp con để xử lý mọi biểu tượng bị thiếu. Ví dụ: các lớp java.io thường dùng nhất là trong libjre_core.a, vì vậy, hãy chỉ đưa thư viện libjre_io.a vào nếu có lỗi biểu tượng chưa được giải quyết có tên bắt đầu bằng JavaIo.

Thư việnCờ liên kếtNội dung mô tả
libjre_core.a –l jre_core Tập hợp các lớp tối thiểu cần thiết cho quy trình mô phỏng JRE của J2ObjC, được tham chiếu bởi tất cả các tệp nguồn đã tạo. Nếu nguồn Java đã dịch tham chiếu đến tính năng hỗ trợ JRE cho những mục như kết nối mạng, XML, SQL, v.v., thì bạn cũng cần liên kết các thư viện bổ sung (ở bên dưới).
libjre_beans.a –l jre_bean Tất cả các lớp trong gói java.beans. Không phải lớp Java Beans nào cũng được đưa vào, vì nhiều lớp chỉ được các ứng dụng Swing và AWT sử dụng.
libjre_channels.a –l jre_channels Một số lớp trong các gói java.nio.channelsjava.nio.channels.spi.
libjre_concurrent.a -l jre_concurrent Một số lớp trong các gói java.util.concurrent, java.util.concurrent.atomicjava.util.concurrent.locks.
libjre_icu.a –l jre_icu Một số lớp từ android.icu để hỗ trợ múi giờ (chủ yếu để bật java.time).
libjre_io.a –l jre_io Một số lớp (ít dùng thường xuyên) trong gói java.io.
libjre_net.a –l jre_net Một số lớp trong gói java.net. Tuy nhiên, lớp java.net.URLClassLoader nằm trong jre_security, còn lớp javax.netjavax.net.ssl nằm trong jre_ssl.
libjre_security.a –l jre_security Hầu hết các lớp trong gói java.security (một vài lớp nằm trong jre_core), cũng như các lớp trong gói java.security.*, javax.crypto.*javax.security.*. Nếu liên kết đường liên kết này, bạn cũng sẽ cần liên kết với khung bảo mật iOS. (xem Thư viện SDK)
libjre_sql.a -l jre_sql Tất cả các lớp trong gói java.sql.
libjre_ssl.a -l jre_SSL Tất cả các lớp trong gói javax.netjavax.net.ssl.
libjre_time.a -l jre_time Tất cả các lớp trong gói java.time.
libjre_util.a -l jre_util Một số lớp trong gói java.util, cũng như gói java.util.logging. Tuy nhiên, hầu hết các lớp java.util đều nằm trong jre_core. Vì vậy, bạn chỉ nên sử dụng thư viện này nếu có lỗi biểu tượng JavaUtil* chưa được giải quyết (các ký hiệu JavaUtilConcurrent* nằm trong thư viện jre_concurrent).
libjre_xml.a -l jre_xml Tất cả lớp trong các gói liên quan đến XML, bao gồm cả javax.xml.*, org.w3c.dom.*org.xml.sax.*.
libjre_zip.a -l jre_zip Tất cả các lớp trong các gói java.util.zipjava.util.jar. Nếu liên kết tệp này, bạn cũng sẽ cần liên kết thư viện zip của SDK. (xem Thư viện SDK)

libjre_emul.a (-l jre_emul)

Thư viện jre_emul chứa tất cả các lớp có trong quy trình mô phỏng JRE của J2ObjC. Nếu một ứng dụng được liên kết với jre_emul, thì bạn sẽ không được thêm thư viện jre_* nào khác hoặc trình liên kết sẽ báo cáo lỗi biểu tượng trùng lặp. Lý do là jre_emul bao gồm tất cả các lớp được xác định trong các thư viện khác đó.

Các thư viện J2ObjC khác

Các thư viện Java và lớp tiện ích Android này được đưa vào bản phân phối J2ObjC dưới dạng thư viện tĩnh:

Thư việnCờ liên kếtNội dung mô tả
libguava.a – trái ổi Guava: Thư viện cốt lõi của Google dành cho Java
libjavax_inject.a -l javax_inject Thư viện chú thích chèn phần phụ thuộc JSR-330.
libjson.a -l json Thư viện trao đổi dữ liệu JSON. Đây là phiên bản JSON dành cho Android, hơi khác với các cách triển khai khác.
libjsr305.a -l jsr305 Các chú giải JSR-305 cho thư viện phát hiện lỗi phần mềm.
libjunit.a -l junit -ObjC Khung kiểm thử JUnit.
libmockito.a -l mockito – ObjC Khung mô phỏng Mockito dành cho các bài kiểm thử đơn vị trong Java.
libprotobuf_runtime.a -l protobuf_runtime Môi trường thời gian chạy Google Protocol Buffer (Vùng đệm giao thức của Google), được tối ưu hoá cho các ứng dụng J2ObjC. Các ứng dụng dùng protobufs J2ObjC nên biên dịch các tệp proto bằng j2objc_protoc.
libandroid_util.a -l android_util Thư viện "android_util" chứa một tập con nhỏ các lớp tiện ích API Android. Thư viện này không nhằm mục đích mô phỏng môi trường Android mà chỉ là một cách để chia sẻ các lớp hữu ích như "android.util.Log".

Cờ -ObjC thường được dùng khi liên kết các ứng dụng iOS, nhưng chỉ bắt buộc khi các lớp và danh mục Objective C cần được tải động từ các thư viện tĩnh. Cờ này khiến tất cả các lớp trong mọi thư viện tĩnh được liên kết đều được đưa vào ứng dụng, dù các lớp đó có thực sự được sử dụng hay không. Do đó, các ứng dụng sử dụng J2ObjC chỉ liên kết với cờ -ObjC khi các lớp không tải được trong thời gian chạy (một triệu chứng là khi gửi JavaLangClassNotFoundException).

Khung kiểm thử JUnit và Mockito phụ thuộc nhiều vào cơ chế phản chiếu, vì vậy, các ứng dụng kiểm thử sử dụng các khung này nên liên kết với -ObjC.

Một giải pháp thay thế cho việc liên kết trong toàn bộ thư viện tĩnh để một vài lớp có thể được tải động là tham chiếu tĩnh các lớp đó. Trong Java, bạn có thể thực hiện việc này trong một khối trình khởi chạy tĩnh; dưới đây là ví dụ từ lớp IosSecurityProvider của 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
  };