必要的連結設定

連結建構步驟 (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.channelsjava.nio.channels.spi 套件
libjre_concurrent.a -l jre_concurrent 許多類別 出發地:java.util.concurrentjava.util.concurrent.atomicjava.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.netjavax.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.netjavax.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.zipjava.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`

連結 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
  };