必需的链接设置

链接构建步骤(Xcode 的“Link Binary With Libraries”构建阶段)需要特定于 J2ObjC 的标志, 具体取决于应用使用翻译后的 Java 类的方式。核心标志由 j2objcc 命令行脚本,但在构建时需要指定 。

SDK 库

J2ObjC 的 JRE 实现必须使用此库。不包含此项 则会导致名称以 _iconv 开头的未定义符号错误。

链接标志说明
iconv -l 图标 jre_core 用于字符编码和解码。

这些库供 J2ObjC 的 JRE 实现使用,可能需要关联到您的应用。

链接标志说明
zip -l z 由 java.util.zip 使用。如果您要关联,则需要添加此代码 jre_zip
安全 - 框架安全性 如果关联 jre_security,则为必需。

图书馆搜索路径

J2ObjC 的发行版包含多个静态库;要使用这些功能,您的项目需要 以及在哪里可以找到它们。

通常,库搜索路径需要包含 _$(j2objcdistribution)/lib,其中 _$(j2objcdistribution) 变量是 J2ObjC 的本地副本的路径。例如,如果您 将 J2ObjC 版本归档文件解压缩到 “/usr/local/”,则该路径为“/usr/local/j2objc”。

重要提示:请勿在项目中实际使用 _$(j2objcdistribution);请务必指定 J2ObjC 的安装实际路径。

如果您通过源代码的副本构建 J2ObjC,则 _$(j2objcdistribution) “j2objc/dist/”目录。在使用 make dist 构建 J2ObjC 之前,此目录不存在。

Xcode:库搜索路径

通过添加 _$(j2objcdistribution)/lib(同样地,使用 实际路径)。

JRE 库

这些库实现了 J2ObjC 的 JRE 模拟定义的类。

注意libjre_core.a 库包含来自其他大部分子集的类 库。若要缩减应用大小,建议的方法是开始关联应用 替换为 -l jre_core,然后添加解析任何缺失符号的子集库。 例如,最常用的 java.io 类位于 libjre_core.a 中, 因此仅当存在未解决的符号错误时,才包含 libjre_io.a 库 且名称以 JavaIo 开头。

链接标志说明
libjre_core.a -l jre_core <ph type="x-smartling-placeholder"></ph> 类别的最小集 是 J2ObjC 的 JRE 模拟所必需的, 生成的源文件如果翻译后的 Java 源代码引用了 JRE 支持 (如网络、XML、SQL 等)以及更多库(见下文) 也将需要关联
libjre_beans.a -l jre_beans <ph type="x-smartling-placeholder"></ph> 所有课程 (来自 java.beans 软件包)。并非所有的 Java Bean 类都是 因为其中许多功能仅由 Swing 和 AWT 应用使用。
libjre_channels.a -l jre_channels <ph type="x-smartling-placeholder"></ph> 多个课程 来自java.nio.channelsjava.nio.channels.spi 软件包
libjre_concurrent.a -l jre_concurrent <ph type="x-smartling-placeholder"></ph> 多个课程java.util.concurrent 开始,java.util.concurrent.atomicjava.util.concurrent.locks 软件包。
libjre_icu.a -l jre_icu <ph type="x-smartling-placeholder"></ph> 多个课程android.icu更改为支持时区(主要是为了启用 java.time)。
libjre_io.a -l jre_io <ph type="x-smartling-placeholder"></ph> 多个(不常用的)类 (来自 java.io 软件包)。
libjre_net.a -l jre_net <ph type="x-smartling-placeholder"></ph> 多个课程java.net 软件包中。不过,java.net.URLClassLoader 类位于 jre_security 中,而 javax.netjavax.net.ssl 类位于 jre_ssl 中。
libjre_security.a -l jre_security <ph type="x-smartling-placeholder"></ph> 大多数课程java.security 软件包中(其中一些位于 jre_core 中), 以及 java.security.* 中的类, javax.crypto.*javax.security.* 软件包。 如果您关联此账号,则还需要关联 iOS 安全框架。 (请参阅 SDK 库
libjre_sql.a -l jre_sql <ph type="x-smartling-placeholder"></ph> 所有课程java.sql 软件包中。
libjre_ssl.a -l jre_ssl <ph type="x-smartling-placeholder"></ph> 所有课程javax.netjavax.net.ssl 软件包中。
libjre_time.a -l jre_time <ph type="x-smartling-placeholder"></ph> 所有课程java.time 软件包中。
libjre_util.a -l jre_util <ph type="x-smartling-placeholder"></ph> 多个课程 (来自 java.util 软件包),以及 java.util.logging 软件包。大多数 java.util 类 但位于 jre_core 中,因此仅当存在 有 JavaUtil* 个未解决的符号错误 (JavaUtilConcurrent* jre_concurrent 库)。
libjre_xml.a -l jre_xml <ph type="x-smartling-placeholder"></ph> 所有课程 来自与 XML 相关的软件包,包括 javax.xml.*org.w3c.dom.*org.xml.sax.*
libjre_zip.a -l jre_zip <ph type="x-smartling-placeholder"></ph> 所有课程 (来自 java.util.zipjava.util.jar 软件包)。 如果您关联此文件,则还需要关联 SDK zip 库。(请参阅 SDK 库

libjre_emul.a (-l jre_emul)

jre_emul 库包含 J2ObjC 的 JRE 模拟中包含的所有类。如果应用 已与 jre_emul 关联,不应包含任何其他 jre_* 库,否则链接器 报告重复符号错误。这是因为 jre_emul 包含这些查询中定义的所有类, 其他库

其他 J2ObjC 库

这些 Java 库和 Android 实用程序类包含在 J2ObjC 中 分发为静态库:

链接标志说明
libguava.a -l 番石榴 Guava:适用于 Java 的 Google Core 库
libjavax_inject.a -l javax_inject JSR-330 依赖项注入 注解库。
libjson.a -l JSON JSON 数据交换库。 这是 <ph type="x-smartling-placeholder"></ph> Android 版 JSON,与其他实现略有不同。
libjsr305.a -l jsr305 软件的 JSR-305 注解 缺陷检测库。
libjunit.a -l junit -ObjC JUnit 测试框架。
libmockito.a -l mockito -ObjC 用于在 Java 中进行单元测试的 Mockito 模拟框架。
libprotobuf_runtime.a -l protobuf_runtime 一个 Google 协议缓冲区 运行时,针对 J2ObjC 应用进行了优化。使用 J2ObjC protobuf 的应用应编译其 proto 包含 j2objc_protoc 的文件。
libandroid_util.a -l android_util “android_util”库包含 Android API 实用程序类的一小部分。 它并非旨在为 Android 环境提供模拟,而只是一种分享方式。 有用的类,如“android.util.Log”。

链接 iOS 应用时经常用到 -ObjC 标志,但只有在 Objective C 类和类别需要从静态库动态加载。如果使用以下标记 要添加到应用中的所有关联静态库中的类,无论这些静态库是否真的 。因此,建议在使用 J2ObjC 的应用仅在下列情况中使用 -ObjC 标志 类在运行时无法加载(一种症状是抛出 JavaLangClassNotFoundException)。

JUnit 和 Mockito 测试框架在很大程度上依赖于反射,因此使用它们的测试应用应该 链接为 -ObjC

除了链接到整个静态库以便动态加载一些类之外,还有一种替代方案是 改为静态引用这些类。在 Java 中,可以在静态初始化程序中完成此操作 block;下面是一个来自 J2ObjC IosSecurityProvider 类:

  // Reference all dynamically loaded classes, so they are linked into apps.
  @SuppressWarnings("unused")
  private static final Class<?>[] unused = {
    IosCertificateFactory.class,
    IosMD5MessageDigest.class,
    IosRSAKeyFactory.class,
    IosRSAKeyPairGenerator.class,
    IosRSASignature.class,
    IosSecureRandomImpl.class,
    IosSHAMessageDigest.class
  };