大部分的 Xcode 專案類型都支援建構規則,可讓開發人員修改 現有檔案類型的建構方式,以及定義新檔案類型的建構方式。 J2ObjC 指令碼專為插入 Xcode 等建構系統而設計。
j2objc-sample-reversi 專案是 範例:如何在簡易 iOS 遊戲中新增 Java 來源。
最低版本需要更新建構設定,然後新增 J2ObjC 建構規則。
更新建構設定
- 在「Project Navigator」中按一下專案,開啟「Project Editor」,並確保 已選取應用程式目標
- 按一下「Build Settings」分頁標籤。
- 將
-ljre_emul
新增至 Other Linker Flags,以連結 JRE 模擬程式庫 (jre_emul
)。 內容應該會類似這樣: - 按一下「+」,然後選取 [新增使用者定義設定]。
- 將設定命名為
J2OBJC_HOME
,並將其值設為 J2ObjC 的位置。這應該 會是 release zip 解壓縮後產生的資料夾 如果您從來源編譯,且根為j2objc
,則顯示j2objc/dist
資料夾。 - 在「搜尋路徑」下方修改下列資訊:
- Framework Search Paths (架構搜尋路徑) 新增
${J2OBJC_HOME}/frameworks
- 「Library Search Paths」 (程式庫搜尋路徑) 會為每項建構設定新增
${J2OBJC_HOME}/lib
。 - 在「User Header Search Paths」(使用者標頭搜尋路徑) 中新增
${J2OBJC_HOME}/include
。
- Framework Search Paths (架構搜尋路徑) 新增
- 請搜尋
J2OBJC_HOME
確認設定。畫面大致如下所示:
新增 J2ObjC 建構規則
決定 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 專案之外,請輸入使用的完整路徑 終端機視窗會列出這些映像檔
在「Project Navigator」中按一下專案,開啟「Project Editor」,並確保 已選取應用程式目標
按一下「Build Rules」(建構規則) 分頁標籤。
按一下「+」新增建構規則。
在新規則的「處理」選項中選取「Java 來源檔案」。「使用」選項應為「自訂指令碼:」。
在自訂指令碼文字方塊中,新增以下內容 (記得取代
$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};
在「Output Files」(輸出檔案) 面板中,按一下 [+] 按鈕,並新增
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h
。再按一下「+」按鈕,然後新增
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m
。
完成後,設定面板看起來會像這樣 (注意:自 10.2 起,Xcode 仍會定義 DERIVED_files_DIR 變數與 DERIVED_FILE_DIR 相同,以提高回溯相容性):
連結其他程式庫
連結建構步驟 (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 群組。