連結建構步驟 (Xcode 的「Link Binary With Libraries」建構階段) 需要 J2ObjC 特定標記, 這會因應用程式使用翻譯 Java 類別的方式而異之所以設定這些核心標記 j2objcc 指令列指令碼,但在建構時需要指定 。
SDK 程式庫
J2ObjC 的 JRE 實作必須使用這個程式庫。無法加入這項資訊
程式庫會導致名稱開頭為 _iconv
的未定義符號錯誤。
媒體庫 | 連結標記 | 說明 |
---|---|---|
iconv | -l 圖示 v | 由 jre_core 用於字元編碼及解碼。 |
這些程式庫是由 J2ObjC 的 JRE 實作項目使用,且可能需要連結至應用程式。
媒體庫 | 連結標記 | 說明 |
---|---|---|
zip | -l Z | 由 java.util.zip 使用。如要建立連結,請務必加入這項資訊 jre_zip。 |
安全性 | 架構安全性 | 如果連結 jre_security,則為必要欄位。 |
程式庫搜尋路徑
J2ObjC 的發行內容包含數個靜態程式庫。但你的專案必須告訴 連結器的位置。
一般而言,程式庫搜尋路徑必須包含 _$(j2objcdistribution)/lib,其中 _$(j2objcdistribution) 變數是 J2ObjC 本機副本的路徑。舉例來說,如果您在 將 J2ObjC 版本封存檔解壓縮至 「/usr/local/」,這個路徑為「/usr/local/j2objc」。
重要事項:請勿在專案中實際使用 _$(j2objc分佈);一律指定 實際安裝 J2ObjC 的路徑
如果您依據原始碼的副本建構 J2ObjC,則 _$(j2objcdistribution) 是複本的
「j2objc/dist/」目錄。使用 make dist
建構 J2ObjC 後,這個目錄才會存在。
Xcode:程式庫搜尋路徑
新增 _$(j2objcdistribution)/lib,更新應用程式目標的程式庫搜尋路徑 (同樣地, 實際路徑)。
JRE 程式庫
這些程式庫實作由 J2ObjC 的 JRE 模擬作業定義的類別。
注意:libjre_core.a
程式庫包含大部分其他子集的類別
程式庫如要縮減應用程式大小,建議的做法是開始連結應用程式
呼叫 -l jre_core
,然後加入可解析任何遺漏符號的子集程式庫。
舉例來說,最常用的 java.io
類別位於 libjre_core.a
,
因此,請只在有未解決的符號錯誤時,才加入 libjre_io.a
程式庫
名稱開頭為 JavaIo
。
媒體庫 | 連結標記 | 說明 |
---|---|---|
libjre_core.a | -l jre_core | 類別數量下限 J2ObjC 的 JRE 模擬所需,由所有 產生的來源檔案如果翻譯後的 Java 來源參照 JRE 支援 ,例如網路、XML、SQL 等,接著是其他程式庫 (請見下文) 也需要加以連結 |
libjre_beans.a | -l jre_beans |
所有課程
從 java.beans 套件取得。並非所有 Java Beans 類別
,因為許多應用程式只適用於 Swing 和 AWT 應用程式。
|
libjre_channels.a | -l jre_channels |
許多類別
來自java.nio.channels 和java.nio.channels.spi
套件
|
libjre_concurrent.a | -l jre_concurrent |
許多類別
出發地:java.util.concurrent ,java.util.concurrent.atomic
和 java.util.concurrent.locks 個套件
|
libjre_icu.a | -l jre_icu |
許多類別
從 android.icu 改為支援時區 (主要為
java.time )。
|
libjre_io.a | -l jre_io |
數個 (較少用) 的類別
從 java.io 套件取得。
|
libjre_net.a | -l jre_net |
許多類別
java.net 套件中。不過,java.net.URLClassLoader
類別位於 jre_security ,而 javax.net 和
javax.net.ssl 類別位於 jre_ssl 。
|
libjre_security.a | -l jre_security |
大部分的課程
java.security 套件中 (有些位於 jre_core ),
以及 java.security.* 中的類別
javax.crypto.* 和 javax.security.* 套件。
建立連結時,您也需要連結 iOS 安全性架構。
(請參閱 SDK 程式庫)。
|
libjre_sql.a | -l jre_sql |
所有課程
java.sql 套件中。
|
libjre_ssl.a | -l jre_ssl |
所有課程
位於 javax.net 和 javax.net.ssl 套件中
|
libjre_time.a | -l jre_time |
所有課程
java.time 套件中。
|
libjre_util.a | -l jre_util |
許多類別
以及來自 java.util 套件的
java.util.logging 套件。最多 java.util 門課程
也位於 jre_core 中,因此請只在有該程式庫的情況下
未解決的 JavaUtil* 符號錯誤
(JavaUtilConcurrent* 個符號在
jre_concurrent 程式庫)。
|
libjre_xml.a | -l jre_xml |
所有課程
從 XML 相關套件 (包括 javax.xml.* ) 載入
org.w3c.dom.* 和 org.xml.sax.* 。
|
libjre_zip.a | -l jre_zip |
所有課程
來自 java.util.zip 和 java.util.jar 套件
如果建立連結,您還需要連結 SDK ZIP 程式庫。(請參閱
SDK 程式庫)
|
libjre_emul.a (-l jre_emul)
jre_emul
程式庫包含 J2ObjC 的 JRE 模擬中包含的所有類別。如果應用程式
與 jre_emul
連結,則不得包含其他 jre_* 程式庫,否則連結器會
回報符號重複的錯誤。這是因為 jre_emul
包含在這些類別中定義的所有類別
其他程式庫
其他 J2ObjC 程式庫
J2ObjC 內含這些 Java 程式庫和 Android 公用程式類別 發布為靜態資料庫:
媒體庫 | 連結標記 | 說明 |
---|---|---|
libguava.a | -l Guava | Guava:Java 適用的 Google Core 程式庫 |
libjavax_inject.a | -l javax_inject | JSR-330 依附元件插入 註解程式庫 |
libjson.a | -l JSON | JSON 資料交換程式庫。 這是 Android 的 JSON 版本,與其他實作項目略有不同。 |
libjsr305.a | -l jsr305 | 適用於軟體的 JSR-305 註解 錯誤偵測程式庫 |
libjunit.a | -l junit -ObjC | JUnit 測試架構。 |
libmockito.a | -l mockito -ObjC | 適用於 Java 單元測試的 Mockito 模擬架構。 |
libprotobuf_runtime.a | -l protobuf_runtime | Google 通訊協定緩衝區 並針對 J2ObjC 應用程式進行最佳化使用 J2ObjC protobufs 的應用程式應編譯 proto Y2objc_protoc 檔案 |
libandroid_util.a | -l android_util | 「android_util」程式庫包含部分 Android API 公用程式類別的子集。 這並非為 Android 環境提供模擬功能,而不只是提供分享管道 例如 `android.util.Log` |
-ObjC 連結旗幟
連結 iOS 應用程式時經常會使用 -ObjC 標記,但只有在目標時才需使用這個標記
C 類別和類別需要從靜態程式庫動態載入。這個標記會導致
所有已連結靜態資料庫中的類別,無論這些類別實際上是否
因此,建議只在下列情況下,使用 J2ObjC 的應用程式連結了 -ObjC 旗標:
類別無法在執行階段載入 (出現一種問題,就是擲回 JavaLangClassNotFoundException
時)。
JUnit 和 Mockito 測試架構非常仰賴反射性,因此使用這些架構的測試應用程式應 連結 -ObjC
除了在整個靜態程式庫中連結,還可動態載入少數類別 改為以靜態方式參照這些類別在 Java 中,可透過靜態初始化器完成 block;這是來自 J2ObjC 的 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
};