大多數的 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 的位置。這應該是版本 ZIP 解壓縮後產生的資料夾,或者如果您是從來源編譯且根層級為j2objc
,就應該是j2objc/dist
資料夾。 - 在「搜尋路徑」下方,修改以下內容:
- 架構搜尋路徑 新增
${J2OBJC_HOME}/frameworks
- 程式庫搜尋路徑:針對每個建構設定,新增
${J2OBJC_HOME}/lib
。 - 「User Header Search Paths」新增
${J2OBJC_HOME}/include
。
- 架構搜尋路徑 新增
- 搜尋「
J2OBJC_HOME
」以確認設定。畫面應如下所示:
新增 J2ObjC 版本規則
決定 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 專案,請在終端機視窗中列出這些檔案時使用的完整路徑。
按一下「Project Navigator」中的專案,開啟「Project Editor」,並確認已選取應用程式目標。
按一下「Build Rules」分頁標籤。
按一下 + 即可新增建構規則。
對於新規則的「Process」選項,選取「Java source files」。「使用」選項應為「自訂指令碼:」。
在自訂指令碼文字方塊中,新增以下內容 (記得取代
$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
套件,您必須將-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 群組。