大多数 Xcode 项目类型都支持构建规则,允许开发者修改 现有文件类型的构建方式,以及新文件类型的构建方式。 J2ObjC 脚本被特意设计用于插入像 Xcode 这样的构建系统。
j2objc-sample-reversi 项目 展示如何在简单的 iOS 游戏中添加 Java 源代码的示例。
最小构建需要更新构建设置,然后添加 J2ObjC 构建规则。
更新 build 设置
- 在 Project Navigator 中点击项目,打开 Project Editor,并确保 应用目标
- 点击 Build Settings 标签页。
- 将
-ljre_emul
添加到 Other Linker Flags(其他链接器标记),以关联 JRE 模拟库 (jre_emul
)。 代码应如下所示: - 点击 +,然后选择添加用户定义的设置。
- 将设置命名为
J2OBJC_HOME
,并将其值设置为 J2ObjC 的位置。这应该 或者是解压缩版本 zip 后得到的文件夹 或j2objc/dist
文件夹(如果您是从源代码编译的且根目录为j2objc
)。 - 在搜索路径下,修改以下内容:
<ph type="x-smartling-placeholder">
- </ph>
- 框架搜索路径添加了
${J2OBJC_HOME}/frameworks
- 库搜索路径中,添加了
${J2OBJC_HOME}/lib
(针对每个 build 配置)。 - 用户标头搜索路径添加了
${J2OBJC_HOME}/include
。
- 框架搜索路径添加了
- 通过搜索“
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};
在“输出文件”面板中,点击 + 按钮并添加:
${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 通过上述步骤报告构建失败,请打开 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 群组。