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

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

Thư viện SDK

Thư viện này là bắt buộc trong quá trình triển khai JRE của J2ObjC. Không bao gồm thông tin này sẽ dẫn đến lỗi biểu tượng không xác định với tên bắt đầu bằng _iconv.

Thư việnCờ liên kếtMô tả
iconv biểu tượng -l jre_core dùng để mã hoá và giải mã ký tự.

Các thư viện này được sử 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ếtMô tả
zip -l z Được java.util.zip sử dụng. Bạn cần thêm đoạn mã này nếu bạn đ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 jre_security.

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

Bản phân phối của J2ObjC bao gồm một số thư viện tĩnh; dự án của bạn cần cho biết cho trình liên kết.

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 tệp lưu trữ phát hành J2ObjC để "/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; 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ừ một bản sao của mã nguồn, thì _$(j2objcdistribution) là bản sao của bản sao "j2objc/dist/" thư mục. 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 trong 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 theo quy trình mô phỏng JRE của J2ObjC.

Lưu ý: Thư viện libjre_core.a chứa các lớp trong hầu hết các tập hợp con khác thư viện. Bạn nên bắt đầu liên kết ứng dụng để giảm kích thước ứng dụng với -l jre_core, sau đó thêm các thư viện tập hợp con giúp giải quyết mọi ký hiệu 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, chỉ thêm thư viện libjre_io.a 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ếtMô tả
libjre_core.a jre_core Tập hợp lớp tối thiểu cần thiết cho quy trình mô phỏng JRE của J2ObjC, được tất cả tệp nguồn được tạo. Nếu các nguồn Java đã dịch tham chiếu đến khả năng hỗ trợ JRE cho những tính năng như nối mạng, XML, SQL, v.v. rồi đến các thư viện bổ sung (bên dưới) bạn cũng cần liên kết tài khoản.
libjre_beans.a -l jre_beans Tất cả các lớp khỏi gói java.beans. Không phải tất cả các lớp Hạt Java đều vì nhiều loại chỉ được sử dụng bởi các ứng dụng Swing và AWT.
libjre_channels.a Kênh Một số lớp từ java.nio.channelsjava.nio.channels.spi .
libjre_concurrent.a jre_concurrent Một số lớp từ java.util.concurrent, java.util.concurrent.atomicjava.util.concurrent.locks.
libjre_icu.a Tôi không hiểu lắm Một số lớp từ android.icu để hỗ trợ múi giờ (chủ yếu để cho phép java.time).
libjre_io.a CANNOT TRANSLATE Một số lớp (ít thường xuyên sử dụng) khỏi gói java.io.
libjre_net.a jre_net Một số lớp trong gói java.net. Tuy nhiên, java.net.URLClassLoader lớp này ở trong jre_security, trong khi javax.net và Lớp javax.net.ssl học trong jre_ssl.
libjre_security.a -l jre_security Hầu hết các lớp trong gói java.security (một số ít nằm trong jre_core), cũng như các lớp trong java.security.*, javax.crypto.*javax.security.*. Nếu liên kết tài khoản này, bạn cũng cần liên kết khung bảo mật iOS. (xem Thư viện SDK)
libjre_sql.a Hàm jre_sql Tất cả các lớp trong gói java.sql.
libjre_ssl.a jre_ssl Tất cả các lớp trong gói javax.netjavax.net.ssl.
libjre_time.a 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 từ gói java.util, cũng như Gói java.util.logging. Nhiều lớp java.util nhất đang ở trong jre_core, vì vậy chỉ đưa thư viện này vào nếu có là các lỗi biểu tượng JavaUtil* chưa được giải quyết (JavaUtilConcurrent* biểu tượng nằm trong jre_concurrent).
libjre_xml.a Tệp jre_xml Tất cả các lớp từ các gói liên quan đến XML, bao gồm javax.xml.*, org.w3c.dom.*org.xml.sax.*.
libjre_zip.a jre_zip Tất cả các lớp qua gói java.util.zipjava.util.jar. Nếu liên kết đường liên kết này, bạn cũng 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 là được liên kết với jre_emul, thì bạn không nên bao gồm thư viện jre_* nào khác, nếu không 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 lớp đó các thư viện khác.

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

Các thư viện Java và lớp sử dụng Android này đều được đưa vào J2ObjC dưới dạng thư viện tĩnh:

Thư việnCờ liên kếtMô tả
libguava.a -l ổi Guava: Các thư viện cốt lõi của Google dành cho Java
libjavax_inject.a -l javax_inject Tính năng chèn phần phụ thuộc JSR-330 thư viện chú giải.
libjson.a Tệp JSON Thư viện trao đổi dữ liệu JSON. Đây là Phiên bản JSON trên Android. Phiên bản này hơi khác một chút so với các cách triển khai khác.
libjsr305.a -l jsr305 Chú thích JSR-305 cho phần mềm thư viện phát hiện lỗi.
libjunit.a -l junit -ObjC Khung kiểm thử JUnit.
libmockito.a -l mockito – ObjC Khung mô phỏng Mockito cho các bài kiểm thử đơn vị trong Java.
libprotobuf_runtime.a -l protobuf_runtime Vùng đệm giao thức của Google thời gian chạy, được tối ưu hoá cho các ứng dụng J2ObjC. Các ứng dụng sử dụng protobuf J2ObjC nên biên dịch proto bằng j2objc_protoc.
libandroid_util.a -l Android_util Thư viện "android_util" chứa một tập hợp con nhỏ các lớp tiện ích API Android. Ứng dụng 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 Mục tiêu Các lớp và danh mục C cần được tải động từ thư viện tĩnh. Cờ này khiến tất cả các lớp trong tất cả thư viện tĩnh được liên kết để đưa vào ứng dụng, cho dù chúng có thực sự đã sử dụng. Do đó, ứ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 dấu hiệu là khi JavaLangClassNotFoundException được gửi).

Khung thử nghiệm JUnit và Mockito chủ yếu dựa vào hoạt động phản chiếu, vì vậy, các ứng dụng thử nghiệm sử dụng chúng 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 một thư viện tĩnh hoàn toàn để 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 trình khởi chạy tĩnh block; đây là ví dụ từ J2ObjC Lớp IosSecurityProvider:

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