Xcode 建構規則

大多數的 Xcode 專案類型都支援建構規則,讓開發人員修改現有檔案類型的建構方式,以及定義新檔案類型的建構方式。J2ObjC 指令碼是專為插入 Xcode 這類建構系統所設計。

j2objc-sample-reversi 專案示範如何在簡易 iOS 遊戲中新增 Java 來源。

最低版本需要更新建構設定,然後新增 J2ObjC 建構規則。

更新建構設定

  1. 按一下「Project Navigator」中的專案,開啟「Project Editor」,並確認已選取應用程式目標。
  2. 按一下「Build Settings」分頁標籤。
  3. -ljre_emul 新增至 Other Linker Flags,以連結 JRE 模擬程式庫 (jre_emul)。看起來應該像這樣: 在 Xcode 中連結 JRE 模擬資料庫
  4. 按一下「+」+圖示,然後選取「新增使用者定義設定」+
  5. 將設定命名為 J2OBJC_HOME,並將其值設為 J2ObjC 的位置。這應該是版本 ZIP 解壓縮後產生的資料夾,或者如果您是從來源編譯且根層級為 j2objc,就應該是 j2objc/dist 資料夾。
  6. 在「搜尋路徑」下方,修改以下內容:
    • 架構搜尋路徑 新增 ${J2OBJC_HOME}/frameworks
    • 程式庫搜尋路徑:針對每個建構設定,新增 ${J2OBJC_HOME}/lib
    • 「User Header Search Paths」新增 ${J2OBJC_HOME}/include
  7. 搜尋「J2OBJC_HOME」以確認設定。畫面應如下所示: Xcode 版本設定

新增 J2ObjC 版本規則

  1. 決定 Java 來源檔案的根目錄,我們將呼叫 $source-root。根目錄是包含來源檔案頂層套件的目錄。

    • 如果您使用 Git,並且想從其他 Git 專案提取 Java 檔案,您可以新增子模組,透過 Java 來源追蹤專案。舉例來說,假設您的 Xcode 專案 (xcodeproj) 位於 ~/dev/MyProject 中,則可能會有另一個 MyProject 目錄內含 Objective-C 來源。在 ~/dev/MyProject/MyProject 目錄中執行 git submodule add git@github.com:user/javaproject,以便直接在 Objective-C 來源旁建立包含 Java 專案原始碼的 ~/dev/MyProject/MyProject/javaproject 目錄。接著,您可以將資料夾拖曳至 MyProject 群組下方的 Xcode 專案,而這個專案會讓檔案系統具備 Xcode 鏡像。${PROJECT_DIR}/MyProject/javaproject/src$source-root

    • 如果 Java 來源位於 Xcode 專案的群組或目錄中,則 $source-root${PROJECT_DIR}/__group_or_directory_name__

    • 如有疑慮,請在該群組或目錄上按一下滑鼠右鍵,然後選取「在 Finder 中顯示」來查看目錄,並使用絕對路徑。

    • 舉例來說,如果 Java 套件 foo.bar 位於名為 ~/myproject/src 的目錄中,該套件的 Java 檔案應位於 ~/myproject/src/foo/bar/**.java,這表示 ~/myproject/src 是專案的根目錄。

    • 如果 Java 來源檔案不屬於 Xcode 專案,請在終端機視窗中列出這些檔案時使用的完整路徑。

  2. 按一下「Project Navigator」中的專案,開啟「Project Editor」,並確認已選取應用程式目標。

  3. 按一下「Build Rules」分頁標籤。

  4. 按一下 + 即可新增建構規則。

  5. 對於新規則的「Process」選項,選取「Java source files」。「使用」選項應為「自訂指令碼:」。

  6. 在自訂指令碼文字方塊中,新增以下內容 (記得取代 $source-root):

    if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi;
    "${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILE_DIR} -sourcepath "$source-root" --no-package-directories -g ${INPUT_FILE_PATH};
    
  7. 在「Output Files」面板中,按一下「+」+按鈕並新增:${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h

  8. 再次按一下「+」+按鈕,然後新增 ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m

完成後,設定面板看起來會像這樣 (注意:自 10.2 起,Xcode 仍會定義 DERIVED_FILES_DIR 變數與 DERIVED_FILE_DIR 相同,以提供回溯相容性):

Xcode 建構規則

連結其他程式庫

連結建構步驟 (Xcode 的「Link Binary With libraries」建構階段) 需要 J2ObjC 專用的標記,這會因應用程式使用已翻譯 Java 類別的方式而異。如需完整清單,請參閱必要的連結設定。以下列舉幾個您可能需要連結的其他程式庫:

  • 若要使用 java.util.zip 套件,您必須將 -ljre_zip 新增至 Other Linker Flags,以連結 libz.dylib 程式庫。
  • 如要安全地產生雜湊值,您必須在專案中新增安全性架構。

對建構問題進行偵錯

如果 Xcode 依據上述步驟回報建構失敗,請開啟問題導覽工具,然後按一下錯誤來查看詳細資料。顯示執行指令列陳述式的詳細資料。以下是一些常見的錯誤:

  • Class 無法解析 - 很有可能,您使用的 $source-path 不正確。在執行的指令中尋找 -sourcepath 選項,並確認選項指向 Java 來源檔案的根目錄。

  • 「JreEmulation.h」檔案未找到 - 最有可能的原因是「User Header Search Paths」(使用者標頭搜尋路徑) 值無效。利用路徑搜尋 -I 選項的建構指令;如果沒問題,請複製路徑 (而非 -I),然後在終端機視窗中執行 ls,確認該路徑並非錯字。

  • "_IOSClass_FromClass",參照 from:"_OBJCCLASS$_Java" - 可能是程式庫搜尋路徑不正確,或是您因為將「Other Linker Flags」設為 -ljre_emul,而忘記連結 JRE 模擬資料庫。您可能也需要連結其他程式庫。

  • 未定義的符號:_iconv* - 必要 iconv 程式庫中的連結。

如果仍有問題,請造訪 j2objc-discuss 群組