【问题标题】:Woodstox on AndroidAndroid 上的伍德斯托克斯
【发布时间】:2023-03-03 06:01:21
【问题描述】:

我之前曾大量使用本地 Java 1.6 Stax 解析器编写了一个 Java 库。但是,我现在想将此库用于 Android,这意味着不支持此解析器。我想使用 Woodstox,因为它实现了 Stax 1.0 api,而且我不必重写我当前的任何代码,只需在依赖项中添加。

Android 没有 stax 1 api,所以我意识到我必须添加它。现在,我已将 woodstox-core-asl-4.2.0.jar、stax-api-1.0-2.jar 和 stax2-api-3.1.3.jar 添加到类路径中。一切都编译得很好,但是当我真正尝试运行依赖于这个库的 Android 应用程序时,我得到运行时错误,表明它没有使用 Woodstox 作为 stax 1 api 的实现。

我有什么误解或做错了吗?我错过了一个罐子吗?我已经彻底阅读了Woodstox help page,但找不到我遗漏的任何其他内容。

编辑:我开始怀疑是否真的可以在 Android 上使用 Woodstox。问题在于对 stax api 的依赖。经过一些研究后,我发现 Dalvik VM 似乎无法接受那些位于 javax.* 命名空间中的包。

【问题讨论】:

    标签: java android xml woodstox


    【解决方案1】:

    你如何传递XMLInputFactory / XMLOutputFactory 实例?通常最好直接构造实例(WstxInputFactoryWstxOutputFactory),因为 callign XMLInputFactory.newInstance() 并没有真正的好处:最多会增加开销(慢得多,扫描类路径)。

    您不会错过任何罐子:始终需要 core 和 stax2-api;如果平台不包含 Stax API jar(Android 出于某种奇怪的原因不包含,即使它是 JDK 1.6 的一部分),那么就是那个。

    编辑

    自动发现应该基于以下几点:

    1. XMLInputFactory(等)检查匹配的系统属性(“javax.xml.stream.XMLInputFactory”)是否有值;这是要使用的工厂的类名(如果有)。因此您可以使用特定的 impl 值设置系统属性
    2. 如果没有找到系统属性,查看是否有资源META-INF/services/javax.xml.stream.XMLInputFactory可以读取;一行与类名
    3. 如果两者都不起作用,请尝试创建默认实例;对于 J2SE SDK,这将是 Oracle 提供的实现 (Sjsxp)

    Woodstox 提供 SPI 信息(步骤 2),以自动注册自身。但是由于在 Android 上你重新打包了 jars(作为 Android 包,APK?),资源文件可能不包括在内,或者找不到。如果这是根本原因,您仍然可以设置匹配的系统属性。如果没有,您将需要使用其他方式提供类名或工厂实例。

    【讨论】:

    • 对我来说,使用 Woodstox 的全部意义在于不必修改我的旧代码 - 因此,我只是调用 XMLInputFactory.newInstance(),而不是 WstxInputFactory。如果我不能调用这些方法(即使是,它会更慢),那么 Woodstox 对我来说并不是非常有用。由于 Woodstox 实现了这个 api,为什么这会是一个问题?
    • 如果 Stax API(来自 JDK)在 Android 上正常工作,它将以这种方式工作;它绝对适用于 J2SE/J2EE。只是这种间接往往会导致没有好处的问题(不仅仅是性能,而且如果你有多个 impl 等);对我来说,更好的方法是使用一个辅助方法来实例化XMLInputFactory。然后,该方法可以使用自动发现或直接引用。
    • 澄清我的回答:我建议也许 Stax API 自动发现在 Android 上存在问题。通过直接实例化(您的库可以只采用调用者可以提供的XMLInputFactory),您至少可以消除一个问题因素。我用更多信息编辑了我的答案,以防它可能有助于解决问题。
    • 我试过你说的,还是有问题。我很确定这是问题所在:事实证明,Dalvik(android vm)不允许您使用 jar 中的“核心”类(即 javax 前缀)。因此,除非重新打包,否则 Woodstox(以及我看过的许多其他人)将无法在 Android 上开箱即用。重新打包开始遇到开源问题,因为它被视为修改代码而不是简单地使用它。 :(
    • @EmilyGerner 是的,Android 架构师过去一直是真正的笨蛋,包括javax 包的不完整(和不一致......)子集——更糟糕的是,不允许包含缺失的部分。根据错误报告(我实际上在几年前为javax.xml.stream 提交了一份报告),这听起来像是无知或傲慢;从来不知道是哪一个。但我认为这些问题已经在较新的 Android SDK 版本中得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多