在编译特定的 Android 项目时,并且仅在我的 Windows 机器上,我java.nio.BufferOverflowException从 dex 获得了一个 during 。使用 Eclipse 和使用 Ant 时都会出现此问题。
java.nio.BufferOverflowException
使用 Ant 时的输出是:
... [dex] Pre-Dexing C:\MyProject\libs\android-support-v4.jar -> android-support-v4-5f5341d3c1b10a79d7d93f9c1e64421e.jar [dex] Converting compiled files and external libraries into C:\MyProject\bin\classes.dex... [dx] [dx] UNEXPECTED TOP-LEVEL EXCEPTION: [dx] java.nio.BufferOverflowException [dx] at java.nio.Buffer.nextPutIndex(Buffer.java:499) [dx] at java.nio.HeapByteBuffer.putShort(HeapByteBuffer.java:296) [dx] at com.android.dex.Dex$Section.writeShort(Dex.java:818) [dx] at com.android.dex.Dex$Section.writeTypeList(Dex.java:870) [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:437) [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:423) [dx] at com.android.dx.merge.DexMerger$IdMerger.mergeUnsorted(DexMerger.java:317) [dx] at com.android.dx.merge.DexMerger.mergeTypeLists(DexMerger.java:423) [dx] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:163) [dx] at com.android.dx.merge.DexMerger.merge(DexMerger.java:187) [dx] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) [dx] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287) [dx] at com.android.dx.command.dexer.Main.run(Main.java:230) [dx] at com.android.dx.command.dexer.Main.main(Main.java:199) [dx] at com.android.dx.command.Main.main(Main.java:103) BUILD FAILED C:\Users\Jaap\android-sdks\tools\ant\build.xml:892: The following error occurred while executing this line: C:\Users\Jaap\android-sdks\tools\ant\build.xml:894: The following error occurred while executing this line: C:\Users\Jaap\android-sdks\tools\ant\build.xml:906: The following error occurred while executing this line: C:\Users\Jaap\android-sdks\tools\ant\build.xml:284: null returned: 2
使用 Eclipse 时,消息更短但类似:
[2013-11-01 14:29:44] APK file is not created for Project: [2013-11-01 14:29:46 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace. [2013-11-01 14:29:46 - MyProject] Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
就像我说的,我的 MacBook 上没有这个问题,即使它们都升级到了最新版本的 Android 构建工具:19.0.0。
无需将构建工具降级回 18.1.1 1,此问题已通过构建工具 19.0.1 修复。
如果由于某种原因您不能使用 19.0.1,那么:
确保 AndroidManifest.xml* 中的值与 project.propertiesandroid:targetSdkVersion中的值匹配。如果这两个值不相同,则使用 19.0.0 版构建工具构建将在 BufferOverflowException 中结束。资源 target=android-<value> ***
android:targetSdkVersion
target=android-<value>
从这篇文章的评论中也有一些迹象表明,您需要至少定位 19 (android-19)。如果您的目标是 < 19,如果此解决方案也适用,请发表评论。
这就是修复程序在我的项目中的查找方式。相关的 AOSP 问题是 #61710。
1 如果确实需要降级,不需要卸载构建工具19.0.0,只需安装18.1.1并添加sdk.buildtools=18.1.1到local.properties文件中即可。
sdk.buildtools=18.1.1
local.properties