Xcode 构建规则

大多数 Xcode 项目类型都支持构建规则,允许开发者修改 现有文件类型的构建方式,以及新文件类型的构建方式。 J2ObjC 脚本被特意设计用于插入像 Xcode 这样的构建系统。

j2objc-sample-reversi 项目 展示如何在简单的 iOS 游戏中添加 Java 源代码的示例。

最小构建需要更新构建设置,然后添加 J2ObjC 构建规则。

更新 build 设置

  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/dist 文件夹(如果您是从源代码编译的且根目录为 j2objc)。
  6. 搜索路径下,修改以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • 框架搜索路径添加了 ${J2OBJC_HOME}/frameworks
    • 库搜索路径中,添加了 ${J2OBJC_HOME}/lib(针对每个 build 配置)。
    • 用户标头搜索路径添加了 ${J2OBJC_HOME}/include
  7. 通过搜索“J2OBJC_HOME”确认您的设置。您应该会看到类似如下所示的内容: Xcode Build 设置

添加 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. 在“输出文件”面板中,点击 + 按钮并添加:${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 通过上述步骤报告构建失败,请打开 Issue Navigator(问题导航器)并 请点击错误,检查详细信息。这会显示 语句。以下是一些常见错误:

  • Class 无法解析 - 您使用的 $source-path 很可能不正确。 在已执行的命令中查找 -sourcepath 选项,并确保它指向 根目录在 Java 源文件的根目录下。

  • “JreEmulation.h”file not found - 很可能是错误用户标头搜索 Paths 值。使用路径在构建命令中搜索 -I 选项;如果一切正常 复制路径(不是 -I),然后在终端窗口中通过该路径运行 ls 进行验证 不是拼写错误。

  • "_IOSClass_FromClass", reference from:"_OBJCCLASS$_Java" - Library 搜索路径不正确,或者您忘记通过设置其他来关联 JRE 模拟库 链接器标记-ljre_emul。您可能还需要关联其他库。

  • 未定义的符号:_iconv* - 所需的 iconv 库中的链接。

如果仍有问题,请询问 j2objc-discuss 群组