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ện | Cờ liên kết | Nộ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ện | Cờ liên kết | Nộ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ện | Cờ liên kết | Nộ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.channels và java.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.atomic và java.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.net và javax.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.* và 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.net và javax.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.* và org.xml.sax.* .
|
libjre_zip.a | -l jre_zip |
Tất cả các lớp trong các gói java.util.zip và java.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ện | Cờ liên kết | Nộ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ờ liên kết -ObjC
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
};