将jar包导入Android项目时出现错误

6

在将apache xerces.jar加入构建路径时,我遇到了以下错误:

我之前已经搜索过这个错误了,解决方案是针对冲突的jar包,但这里并不是这种情况,我因为utf-8格式不正确而出现了一些ParserException。

我尝试过以下方法(但都没有成功):

  • 清理项目
  • 重新启动eclipse
  • 更新adt、sdk
  • 删除所有库文件并修复项目属性,然后导入xerces以解决冲突
  • 此外,我只有一个外部库xerces

参考这里的解决方案。

如果移除xerces,则可以运行该项目。

几个月前,我正常地通过构建路径导入了xerces,并且它也能够正常工作。任何帮助都将不胜感激!

[2013-12-24 12:21:44 - tryout] Dx UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.cf.iface.ParseException:bad utf-8 byte a0 at offset 00000004 atcom.android.dx.cf.cst.ConstantPoolParser.parseUtf8(ConstantPoolParser.java:374) at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:262) at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:294) at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:150) at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124) at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115) at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:482) at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406) at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388) at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251) at com.android.dx.command.dexer.Main.processClass(Main.java:665) at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634) at com.android.dx.command.dexer.Main.access$600(Main.java:78) at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572) at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284) at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166) at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144) at com.android.dx.command.dexer.Main.processOne(Main.java:596) at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264) at com.android.dx.command.dexer.Main.run(Main.java:230) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.android.ide.eclipse.adt.internal.build.DexWrapper.run(DexWrapper.java:187) at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:786) at com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder.build(PostCompilerBuilder.java:597) at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:733) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:328) at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:403) at org.eclipse.core.internal.resources.Project$1.run(Project.java:618) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2345) at org.eclipse.core.internal.resources.Project.internalBuild(Project.java:597) at org.eclipse.core.internal.resources.Project.build(Project.java:124) at com.android.ide.eclipse.adt.internal.project.ProjectHelper.doFullIncrementalDebugBuild(ProjectHelper.java:1116) at com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate.launch(LaunchConfigDelegate.java:147) at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:858) at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:707) at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1018) at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1222) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)Caused by: java.lang.IllegalArgumentException: bad utf-8 byte a0 at offset 00000004 at com.android.dx.rop.cst.CstString.throwBadUtf8(CstString.java:171) at com.android.dx.rop.cst.CstString.utf8BytesToString(CstString.java:143) at com.android.dx.rop.cst.CstString.(CstString.java:200) at com.android.dx.cf.cst.ConstantPoolParser.parseUtf8(ConstantPoolParser.java:371) ...43 more...while parsing cst 012c at offset 00000afe ...while parsing cst 00a5 at offset 00000316 ...while parsing > org/apache/xerces/impl/xpath/regex/ParserForXMLSchema.class

> [2013-12

2个回答

3
在你的问题中,你提到:
几个月前,我通过构建路径正常导入了xerces,并且它也能够正常工作。这引起了我的警觉,因为对于不断更新的库来说,“几个月”可能就相当于一生。也许你的问题不在于jar文件与Eclipse的兼容性,而是在于jar文件本身存在问题,这可以解释你遇到“坏的UTF-8字节”的解析器错误。
根据Apache(http://xerces.apache.org/xerces2-j/install.html)的说法,原来的xerces.jar现已被弃用: xerces.jar已不再包含在主要发行版中。你仍然可以从弃用的发行版中下载该jar。xerces.jar是一个包含所有解析器类文件的Jar文件(即,它包含xercesImpl.jar和xml-apis.jar内容的交集)。
因此,在上述页面上,我发现你只需要用两个新文件替换xerces.jar:xercesImpl.jar和xml-apis.jar。请参见下面的摘录(来自上述链接):
引用:

Xerces jar文件的更改

为了适应Xerces与诸如Xalan之类的XSLT处理器一起使用的非常普遍的情况,在Xerces 2.0.0 beta 3和beta 4之间引入了一个默认组织Xerces的jar文件的更改。除了我们仍然生产的xercesSamples.jar文件之外,Xerces曾经带有一个名为xerces.jar的文件。该文件包含所有解析器的功能。现在包括两个文件:xercesImpl.jar,我们实现各种API的文件,以及xml-apis.jar,API本身。这样做是为了如果您的XSLT处理器与Xerces-J支持的API级别相同,则可以避免将xml-apis.jar放在类路径上。

如果您仍然想/需要使用xerces.jar,Apache提供了一种向后兼容性的方法:
如果您希望使用xerces.jar,我们已经包含了几个Ant目标以实现向后兼容。 "Ant目标"是提供给我们的构建工具Ant的参数,它告诉Ant应用build.xml文件的哪些部分。
如果您在Windows系统上并且只想获取xerces.jar文件,则需要执行build.bat deprecatedjars命令。
上面的链接继续列出了您可能遇到的更多版本问题。如果这不能解决您的问题,请告诉我;否则,我将继续寻找潜在的解决方案。

谢谢您的回答,但我已经采用了另一种方法。是的,我理解库的频繁更新,我肯定会再次需要EXI功能,因此也需要Xerces。几周后我会再联系您,为我的另一个项目提供反馈。如果您的解决方案在几天内有效,我会向您报告。谢谢 :) - riteshtch
@cooperHawk,你是怎么解决这个问题的?我也遇到了完全相同的问题 :( - Minas

1
这似乎是最新的ADT出现了问题。自从我更新到ADT 22.6.3以来,我一直遇到同样的问题,并通过从构建路径中删除xerces JAR文件,并改用xerces-for-android的源代码来解决该问题: https://code.google.com/p/xerces-for-android/source/checkout 您只需要使用SVN下载源代码,然后将源代码复制到项目源文件夹中,并更新一些导入。它对我有用。
希望对您有所帮助。

我尝试了你的方法来解决问题,但是当我尝试时出现了很多错误,请问我该如何解决? - Neha Shukla
@NehaShukla 我也是一样..现在我遇到了与xalan.jar相关的错误..我想我会转向json,无论xml apis遇到什么问题。 - riteshtch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接