1
Android Studio 2.2.2
Compile SDK Android 7.1.1
Build Tools: 25.0.0
Gradle version: 2.14.1
Min SDK: 19
Target SDK: 25

jackson-dataformat-xml-2.8.5.jar尝试执行此操作时遇到问题:

 JacksonXmlModule module = new JacksonXmlModule();
 ObjectMapper xmlMapper = new XmlMapper(); //This line

引发以下异常

E/AndroidRuntime: FATAL EXCEPTION: Thread-418
              Process: cb.myAppName, PID: 29744
              java.lang.VerifyError: com/fasterxml/jackson/dataformat/xml/XmlFactory
                  at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:49)
                  at cb.myAppName.Core.GenerateReturnXMLFile(Core.java:863)
                  at cb.myAppName.RouteScreenActivity$4.run(RouteScreenActivity.java:305)
                  at java.lang.Thread.run(Thread.java:841)

根据我的研究,这与 Jackson 1.3 中引入的二进制不兼容有关。正如 Tatu Saloranta 在他的旧博客中所述,遗憾的是,该博客已不再在线。

我一直非常重视兼容性,至少对于任何“非 beta”版本(1.0 及更高版本)而言。因此,我们的想法是任何 1.x 版本都将比以前的版本简单的即插即用。这确实适用于补丁版本;但事实证明,并非所有次要版本都以这种方式工作。例如,版本 1.2 和 1.3 有一些意想不到的不兼容性。

问题是这样的:虽然大多数情况下二进制兼容性是比源代码兼容性更难的目标——也就是说,如果你破坏源代码兼容性,你几乎肯定会破坏二进制兼容性——但严格来说并非如此。具体来说,很可能进行某些源兼容但不兼容二进制的更改。

具体的例子是将不返回任何内容的方法(“void 方法”)更改为返回不破坏编译的方法。但它确实破坏了二进制兼容性。啊。

这正是当我决定让 ObjectMapper 遵循“流利”模式以允许链接配置方法调用时发生的事情。如果不是这种“隐藏”的 API 更改,那就太好了……

不太确定如何纠正这个问题,因为我对 android 开发还很陌生。

正如您在我的依赖项列表中看到的那样,我已经确保全面使用相同版本的 Jackson app/build.gradle,是否还有其他我可能遗漏的东西?

dependencies {
    compile fileTree(include: ['*.jar'], exclude: ['com.symbol.emdk.jar'], dir: 'libs')
    compile files('../libs/json-20151123.jar')
    provided files('../libs/com.symbol.emdk.jar')
    compile files('../libs/slf4j-api-1.7.6.jar')
    compile files('../libs/logback-android-1.1.1-4.jar')
    compile files('../libs/sun.misc.BASE64Decoder.jar')
    compile files('../libs/ZSDK_ANDROID_API.jar')
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:support-v7:22.2.0'
    compile 'com.google.code.ksoap2-android:ksoap2-android:3.6.0'
    compile 'com.google.code.gson:gson:2.4'
    compile 'org.apache.directory.studio:org.apache.commons.io:2.4'
    compile 'org.joda:joda-money:0.11'
    compile 'org.apache.directory.studio:org.apache.commons.lang:2.6'
    compile 'com.google.android.gms:play-services-appindexing:9.8.0'
    compile 'org.greenrobot:eventbus:3.0.0'
    compile 'com.fasterxml.jackson.core:jackson-core:2.8.5'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.8.5'
    compile 'com.fasterxml.jackson.datatype:jackson-datatype-joda:2.8.5'
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.5'
    compile 'com.github.gcacace:signature-pad:1.2.0'
}

根据官方FasterXML Jackson github 页面,应该支持我正在使用的扩展...

XML:支持XML;提供流和数据绑定实现。类似于 JAXB 的“代码优先”模式(不支持“XML Schema first”,但可以使用 JAXB bean)

https://github.com/FasterXML/jackson-dataformat-xml

该项目的 github 页面上也报告了此问题,但没有找到真正的解决方案。-- github.com/FasterXML/jackson-dataformat-xml/issues/116

更新:我使用jarjar了以下依赖项:

compile files('../libs/cb-joda-time-2.9.6.jar')
compile files('../libs/cb-joda-money-0.12.jar')
compile files('../libs/cb-jackson-dataformat-xml-2.8.5.jar')
compile files('../libs/cb-jackson-datatype-joda-2.8.5.jar')
compile files('../libs/cb-java-json-0.13.0.jar')
compile files('../libs/cb-json-20160212.jar')

还将每个依赖项以及我的appcompatsupportapi 升级到最新版本。

错误继续 -

java.lang.VerifyError: cb/com/fasterxml/jackson/dataformat/xml/XmlFactory
                      at cb.com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:49)

希望有人能对此有所了解,不知道是什么原因造成的......

4

1 回答 1

0

经过用户aha的一些研究和提示后,我能够进一步确定如何纠正这个问题。我没有时间测试它,因为我最终采取了不同的路线并使用SimpleXML库来代替它,这非常适合我需要做的事情。

当我开始测试它时,我会用更多细节更新这个答案,但这里有一些方法可以尝试和纠正这个问题:

这是 github 上的原始问题:github.com/FasterXML/jackson-dataformat-xml/issues/116

于 2016-12-05T13:47:00.043 回答