`

Android中如果你也使用commons-codec-1.6并且出现了问题

阅读更多

http://my.oschina.net/zhibuji/blog/115463?p=1

----------------------------------------------------------

经过测试,确实如此。重新打包换包名后,可以正常使用。


----------------------------------------------------------
首先说我的开发环境:
eclipse + android-sdk_r21.1-windows。

项目中需要使用commons-codec-1.6.jar来做加密。就使用了里面一个方法:

?
1
DigestUtils.shaHex(codes)
然后。。然后我就被坑了一下午,一下午 

(提示:
如果你对我纠结的过程没兴趣,可以自行绕道最后解决办法,直接看解决方法。
如果你觉得你想知道原因,你可以直接原因去看原因,然后自己去找解决方法。
如果看博客的你对我解释的原因另有高见,请留言。
如果你觉得先自己再打个jar麻烦,可以直接邮件或者QQ问我要,留言也可以。)

先说说使用步骤:在ADT17之后,新建项目之后,自动会有一个libs文件夹,只要将jar包拷贝到这个文件夹下,不需要build path了。如果是低于ADT17那么需要自己新建一个lib然后右键build path→add to build path.
我就乖乖的从http://archive.apache.org/dist/commons/codec/binaries/这里下载我需要的版本。然后解压,拷贝出commons-codec-1.6.jar到libs下面。在程序中立马就可以使用了。我在我的工程中使用了上面的那个方法,接下来,让我纠结的问题就出现了,在运行的时候,就开始报错,找不到那个方法。(不是找不到类)。
报错如下:

03-23 15:06:09.158: DEBUG/dalvikvm(132): GC_EXPLICIT freed <1K, 50% free 2706K/5379K, external 0K/0K, paused 77ms
03-23 15:06:09.218: INFO/dalvikvm(18491): Could not find method org.apache.commons.codec.binary.Hex.encodeHexString, referenced from method org.apache.commons.codec.digest.DigestUtils.md5Hex
03-23 15:06:09.218: WARN/dalvikvm(18491): VFY: unable to resolve static method 3722: Lorg/apache/commons/codec/binary/Hex;.encodeHexString ([B)Ljava/lang/String;
03-23 15:06:09.218: DEBUG/dalvikvm(18491): VFY: replacing opcode 0x71 at 0x0004
03-23 15:06:09.218: DEBUG/dalvikvm(132): GC_EXPLICIT freed <1K, 50% free 2706K/5379K, external 0K/0K, paused 65ms
03-23 15:06:09.238: DEBUG/dalvikvm(18491): VFY: dead code 0x0007-0008 in Lorg/apache/commons/codec/digest/DigestUtils;.md5Hex (Ljava/io/InputStream;)Ljava/lang/String;
我觉得可能是导入包,导入的不正确。突然就不相信自己的经验了,各种百度,各种Google。然后各种试验,clear工程,将包删除重新导入,删除手机中的应用.....到最后我都重启eclipse,就差重启电脑了。网上说的所有方法都试过了,但是我的问题还是依然存在。折腾到这个地步,觉得应该是导入包的方法问题,可能是包本身存在问题。我是从官网下的,难道我下载错了?英语不好,也没烂到下载个jar包也下载错误的底部啊。还是去CSDN下载了一个,花费我一个积分(心疼~),然后导入,依然错误。更郁闷了,但是这时,我坚定我的英语能力下载个jar包是没问题的(总能自我娱乐下子,哈哈)。然后我。。。没有办法了,找人各种讨论,终于有了
最后的解决办法:


用eclipse把源代码下载下来,重新打包,修改原来的包名,(把包名任意加一个字母或者减一个字母,代码不用动,一点也不用动哈),然后将源代码打包成jar。最后将新装的旧酒,放到工程的libs下面。无须build path(ADT 17以后)。启动工程,你发现了没,不报错了。而且加密结果正确。
这是我改包名之前和改之后导入路径不同:

import org.apache.commons.codec.digest.DigestUtils;//之前版本
import org.apaches.commons.codec.digest.DigestUtils;//之后版本,多了一个s

原因:几个人讨论结果是:Google Android内部也有一个包名一样的工程,而且类名也相同,关键一点是没有该方法!于是导致包名冲突,大家都知道java的调用机制,我就不多说了,然后系统就在自己的里面找到了同样名字的这个类,然后去调用系统自己该类下面我们用的那个方法。然而系统根本就没有那个方法,于是呼...我们的这个可用的方法就歇菜了。根本就没被调用到。

(2013.05.18面试有些失利)本人要潜心研究技术,慢慢沉淀,所以QQ一般不会上,邮箱可能存在回复延迟,所以给个连接,遇到问题的可以直接到这里下载。

生命不息编码不止,某公司,我会再来的!(2013.05.20)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics