Xcode 构建规则

大多数 Xcode 项目类型都支持构建规则,这些规则允许开发者修改现有文件类型的构建方式,并定义新文件类型的构建方式。J2ObjC 脚本经过专门设计,可用于插入 Xcode 等构建系统。

j2objc-sample-reversi 项目说明了如何将 Java 源代码添加到简单的 iOS 游戏。

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

更新 build 设置

  1. 点击 Project Navigator 中的项目以打开 Project Editor,确保已选择应用目标。
  2. 点击“Build Settings”(构建设置)标签页。
  3. -ljre_emul 添加到其他链接器标记,以关联 JRE 模拟库 (jre_emul)。它应如下所示: 在 Xcode 中关联 JRE 模拟库
  4. 点击 + 并选择添加用户定义的设置
  5. 将设置命名为 J2OBJC_HOME,并将其值设置为 J2ObjC 的位置。该文件夹应该是解压缩发布 zip 后得到的文件夹或 j2objc/dist 文件夹(如果您通过源代码进行编译且根目录为 j2objc)。
  6. 搜索路径下,修改以下内容:
    • Framework Search Paths(框架搜索路径)添加了 ${J2OBJC_HOME}/frameworks
    • 库搜索路径 (Library Search Paths) 添加了 ${J2OBJC_HOME}/lib(针对每个 build 配置)。
    • 用户标头搜索路径 (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 创建一个 ~/dev/MyProject/MyProject/javaproject 目录,其中包含 Java 项目的源代码和 Objective-C 源代码。然后,您可以将该文件夹拖动到 MyProject 组下的 Xcode 项目中,该组包含 Xcode 镜像您的文件系统。${PROJECT_DIR}/MyProject/javaproject/src$source-root

    • 如果您的 Java 源代码位于 Xcode 项目的某个组或目录中,则 $source-root${PROJECT_DIR}/__group_or_directory_name__

    • 如果有疑问,请右键点击该组或目录,然后选择“在查找器中显示”以查看该目录并使用绝对路径。

    • 例如,如果您在名为 ~/myproject/src 的目录中有 Java 软件包 foo.bar,则该软件包的 Java 文件应位于 ~/myproject/src/foo/bar/**.java 中,这意味着 ~/myproject/src 是项目的根目录。

    • 如果 Java 源文件位于 Xcode 项目外部,请输入在终端窗口中列出 Java 源文件时使用的完整路径。

  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_FILE_DIR 相同的 DERIVED_FILES_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”文件未找到 - 这很可能是因为用户标头搜索路径值不正确。在构建命令中搜索包含路径的 -I 选项;如果看起来没问题,请复制该路径(不是 -I),然后在终端窗口中使用该路径运行 ls,以验证是否存在拼写错误。

  • "_IOSClass_FromClass", Reference from:"_OBJCCLASS$_Java" - 库搜索路径不正确,或者您忘记通过将 Other Linker Flags 设置为 -ljre_emul 来关联 JRE 模拟库。您可能还需要关联其他库。

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

如果仍有问题,请咨询 j2objc-suite