链接构建步骤(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.channels 和java.nio.channels.spi
软件包
|
libjre_concurrent.a | -l jre_concurrent |
<ph type="x-smartling-placeholder"></ph>
多个课程
从 java.util.concurrent 开始,java.util.concurrent.atomic
和 java.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.net 和
javax.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.net 和 javax.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.zip 和 java.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”。 |
-ObjC 链接标记
链接 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
};