大多数 Xcode 项目类型都支持构建规则,这些规则允许开发者修改现有文件类型的构建方式,并定义新文件类型的构建方式。J2ObjC 脚本经过专门设计,可用于插入 Xcode 等构建系统。
j2objc-sample-reversi 项目说明了如何将 Java 源代码添加到简单的 iOS 游戏。
最低构建要求更新构建设置,然后添加 J2ObjC 构建规则。
更新 build 设置
- 点击 Project Navigator 中的项目以打开 Project Editor,确保已选择应用目标。
- 点击“Build Settings”(构建设置)标签页。
- 将
-ljre_emul
添加到其他链接器标记,以关联 JRE 模拟库 (jre_emul
)。它应如下所示: - 点击 + 并选择添加用户定义的设置。
- 将设置命名为
J2OBJC_HOME
,并将其值设置为 J2ObjC 的位置。该文件夹应该是解压缩发布 zip 后得到的文件夹或j2objc/dist
文件夹(如果您通过源代码进行编译且根目录为j2objc
)。 - 在搜索路径下,修改以下内容:
- Framework Search Paths(框架搜索路径)添加了
${J2OBJC_HOME}/frameworks
- 库搜索路径 (Library Search Paths) 添加了
${J2OBJC_HOME}/lib
(针对每个 build 配置)。 - 用户标头搜索路径 (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
创建一个~/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 源文件时使用的完整路径。
点击 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_FILE_DIR 相同的 DERIVED_FILES_DIR 变量):
关联其他库
链接构建步骤(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。