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 的位置。這應該 會是 release zip 解壓縮後產生的資料夾 如果您從來源編譯,且根為 j2objc,則顯示 j2objc/dist 資料夾。
  6. 在「搜尋路徑」下方修改下列資訊:
    • Framework Search Paths (架構搜尋路徑) 新增 ${J2OBJC_HOME}/frameworks
    • 「Library Search Paths」 (程式庫搜尋路徑) 會為每項建構設定新增 ${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,則 可能有另一個包含 Objective-C 來源的 MyProject 目錄。在 ~/dev/MyProject/MyProject 目錄執行 git submodule add git@github.com:user/javaproject 至 建立含有 Java 專案原始碼的 ~/dev/MyProject/MyProject/javaproject 目錄 將目標放在 Objective-C 來源上。隨後,請將該資料夾拖曳至 Xcode 專案中 MyProject 群組下,具有 Xcode 鏡像檔案系統。 ${PROJECT_DIR}/MyProject/javaproject/src$source-root

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

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

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

    • 如果 Java 來源檔案在 Xcode 專案之外,請輸入使用的完整路徑 終端機視窗會列出這些映像檔

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

  3. 按一下「Build Rules」(建構規則) 分頁標籤。

  4. 按一下「+」新增建構規則。

  5. 在新規則的「處理」選項中選取「Java 來源檔案」。「使用」選項應為「自訂指令碼:」。

  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 套件,您必須連結 libz.dylib 程式庫,方法是新增 -ljre_zip 加入其他連接器旗標
  • 如要產生安全雜湊,您必須在專案中新增安全性架構。

對建構問題偵錯

如果 Xcode 按照上述步驟回報建構失敗,請開啟問題導覽工具,然後 按一下錯誤即可查看詳細資料。這會顯示指令列 陳述式以下列舉幾個常見錯誤:

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

  • 「JreEmulation.h」找不到檔案 - 問題很可能是無效的使用者標頭搜尋 Paths 的值。使用路徑搜尋 -I 選項的建構指令。沒有問題 請複製路徑 (而非 -I),然後在終端機視窗中,使用該路徑執行 ls 進行驗證 基本上,這沒有錯字

  • 「_IOSClass_FromClass」,從:"_OBJCCLASS$_Java" - 程式庫 搜尋路徑不正確,或是您設定了 Other 連接器旗標-ljre_emul。您可能還需要連結其他程式庫。

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

如果問題仍未解決,請洽詢 j2objc-discuss 群組