您的位置:首页 > 移动开发 > Android开发

Android使用commons-codec-1.6进行数据加密的过程中出现的异常

2018-03-02 10:41 603 查看
导入从官网下载的这个包,编译时不会出错。
但是运行时就会出现这个错误:
NoSuchMethodError: No static method encodeHexString([B)Ljava/lang/String

这篇文章给出了解释:https://my.oschina.net/zhibuji/blog/115463
大概意思就是说,Android本身也有同样的包,只不过同样的类里面的方法比较老旧,程序运行的过程中首先会去使用系统的旧的api来实现,这样就导致运行时候找不到相应的方法了。解决办法就是简单的将原来的jar包改下包的路径名,重新打包成一个新的jar,然后导入到工程中。这样在运行的过程中就只会去找这个jar包里的对应的方法了。大家可以从这里下载:https://pan.baidu.com/share/link?shareid=528601&uk=3759063315

另外贴出原文:
首先说我的开发环境:
eclipse + android-sdk_r21.1-windows。项目中需要使用commons-codec-1.6.jar来做加密。就使用了里面一个方法: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一般不会上,邮箱可能存在回复延迟,所以给个连接,遇到问题的可以直接到这里下载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐