1. 程式人生 > >java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String問題解決

java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String問題解決

Android studio錯誤log:java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.boot.jar)

我們的Android工程要使用A公司提供的技術文件,對一個字串使用base64進行加密,然後把加密的字串傳給A公司的後臺。他們給我們提供的有BASE64加密工具類DesEncrypter.java
和一個測試類WebApitest.java。根據它們提供的加密工具類DesEncrypter,我自行添加了commons-codec-1.10.jar和BASE64.jar這兩個jar包,因為工具類中對字串加密,用到了commons-codec-1.10.jar中的Base64.encodeBase64String(ecipher.doFinal(str.getBytes()))這個方法,對圖片的解碼,用到了BASE64.jar中的BASE64Decoder這個類及這個類的.decodeBuffer(String)方法。新增完這兩個jar包,測試類執行正常,能正常加密,然後把程式碼新增到Android正式程式碼裡,不報錯。然後打包apk安裝到手機,執行APP,到加密這一步,報錯,錯誤如下:


這就奇怪了,明明有這個方法,而且測試類能正常執行,安卓程式碼也沒報錯,也能成功打包,怎麼就報這個錯呢?後來上網搜了,說是commons-codec-1.10.jar不是Android的標準APIs,要使用Android自身的base64類裡的方法。但是Android自身的base64方法裡沒有A公司給我們提供的DesEncrypter.java的加密方法,所以放棄,還是用commons-codec-1.10.jar裡的org.apache.commons.codec.binary.Base64,還是報上面那個錯。後來上網查到要換成Android的base64類,匯入android.util.Base64,然後把commons-codec-1.10.jar裡的方法Base64.encodeBase64String(ecipher.doFinal(str.getBytes()))轉換成android.util.Base64裡的Base64.encodeToString(ecipher.doFinal(str.getBytes()),Base64.DEFAULT),就可以解決了。然後按這個方法去改,測試類WebApitest又一直報錯,無法對字串加密。找了很久的問題,就是找不到。後來實在沒辦法,給A公司打電話,才知道他們提供給我們的方法,是Java後臺的方法,Android端用就是會出現那個問題。問題是,他們壓根沒告訴我那個是Java後臺的方法,而且他們知道我們做的是安卓端。

修改前,測試類能用,安卓程式碼打包執行報錯;修改後,測試類報錯,因為一直以為都是Android端的程式碼,測試類報錯,Android端肯定也報錯,就沒再試Android端程式碼。知道測試類是Java後臺程式碼後,測試類報錯就跟Android無關了,然後直接測試Android程式碼,通過,問題解決了。

/**
	 * 加密
	 * @param str 要加密的字串
	 * @return
	 * @throws Exception
	 */
	public String encrypt(String str) throws Exception {
		 str = new String(str.getBytes(), "UTF-8");
//		return Base64.encodeBase64String(ecipher.doFinal(str.getBytes()));//後臺的commons-codec-1.10.jar包裡的方法
		return Base64.encodeToString(ecipher.doFinal(str.getBytes()),Base64.DEFAULT);//Android自身的BASE64方法
	}

第一步:把匯入的

import org.apache.commons.codec.binary.Base64;

替換為

import android.util.Base64


第二步:把commons-codec-1.10.jar裡的 encodeBase64String()方法,轉換為Android自身的BASE64的encodeToString()。見下圖: