【问题标题】:NoSuchMethodError using commonc codec in Android application在 Android 应用程序中使用 commonc 编解码器的 NoSuchMethodError
【发布时间】:2011-07-06 02:08:52
【问题描述】:

我按照指令here 在eclipse 中为我的Android 应用程序添加了来自apache.org (commons-codec-1.4.jar) 的commons 编解码器。代码中没有错误。但是当我运行应用程序并调用使用编解码器的函数时,应用程序停止并需要前关闭。

logCat 中说:

Android 运行时:java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String

代码行是: 字符串 tmpStr = Base64.encodeBase64String(msg); //msg 是一个字节[]

该应用程序适用于最低 SDK 版本 = 7 (Android 2.1),所以我不能使用 Android Base64

知道如何解决这个问题吗?

【问题讨论】:

  • 在运行时错误之前分析 LogCat:INFO/dalvikvm(292): 找不到方法 org.apache.commons.codec.binary.Base64.decodeBase64,引用自包 WARN/dalvikvm 中的方法(292): VFY: 无法解析静态方法 299: Lorg/apache/commons/codec/binary/Base64;.decodeBase64 (Ljava/lang/String;)[B
  • 考虑这个答案(使用 maven):stackoverflow.com/a/26548748/1084488

标签: android eclipse base64 apache-commons-codec


【解决方案1】:

您遇到问题的原因是这些说明有误,但必须存在不同版本的 commons-codec 或 Base64 类。

我的理解是,您需要将 jar 文件放入项目根目录下的“libs”目录中,以确保它在最终的 apk 中自动结束。一旦你把它放在那里,右键单击 jar 文件,然后转到 Build Path-> Add to build path。应该从那里开始工作。

【讨论】:

  • 我将 commons-codec-1.4.jar 放入我的应用程序文件夹内的 lib 文件夹中。正如你提到的,我添加了 jar 文件,但情况相同。它运行,但是当应用程序调用使用编解码器的函数时,它取消了。 logCat 是一样的。
  • 库还是库? libs非常重要。
  • 对不起,我的文件夹名称是 libs。但是是一样的。运行时错误之前的 LogCat 有以下内容: 03-01 12:47:47.781: INFO/dalvikvm(264): 找不到方法 org.apache.commons.codec.binary.Base64.encodeBase64String,引用自方法 dv.sample .and.msgtest.calc 03-01 12:47:47.781: WARN/dalvikvm(264): VFY: 无法解析静态方法 311: Lorg/apache/commons/codec/binary/Base64;.encodeBase64String ([B)Ljava /lang/String;
【解决方案2】:

我也无法让公共编解码器在 2.1 模拟器上运行。我最后放弃了,自己做,复制代码:

Base64 encoder/decoder

只有一百多行。

【讨论】:

  • 我决定去寻找Android.util.Base64的源代码。我将代码复制到一个名为 Base64.java 的新 java 文件中。然后我将该文件添加到我的项目中 Android.util 包下。我的应用程序运行良好。但我认为这不是最好的方法,当在包含此类的 Android API 8 或更高版本上运行时,这会如何影响应用程序?
【解决方案3】:

我认为这与 Android 库中的名称冲突有关。

我将Base64的java源代码复制到我的项目到org.apache.commons.codec.binary的命名空间中。该项目编译没有任何问题。但是,在Android模拟器的运行时,我遇到了同样的错误,java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String。

但是,在我将命名空间更改为 com.apache.commons.codec.binary 而不是 org 之后,应用程序的运行就像魔术一样。我猜在 Android 实现中,使用了 org.apache.commons.codec.binary,它不允许您再次在代码中使用它。

【讨论】:

    【解决方案4】:

    我遇到了完全相同的问题。所以我开始浏览 android 源代码,事实证明 Don 对 Android 实现 org.apache.commons.code.binary 的猜测是正确的。他对访问它的能力是错误​​的,你可以,但它是 apache commons 的 1.2 版,而不是 1.4 版甚至 1.5 版。 您可以在 android source 中亲自查看。

    另外请注意,这个问题与this post.重复

    【讨论】:

    • 第一个链接“来源”已损坏:X
    • @MichelAyres 已更正
    • 添加,一个简单的解决方法是重构公共包名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多