在Device上找不到但在Emulator上工作的encodeHex方法

时间:2019-06-12 07:18:41

标签: android android-emulator apache-commons

我正在使用RSA加密的项目,需要使用Apache commons-codec中的方法,即:

  • Hex.encodeHex(byte [])
  • Hex.decodeHex(String)

这两个方法在Android模拟器上都可以正常工作,但是它将在设备上返回NoSuchMethodError

public String RSADecrypt(final String message) {
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, getPrivateKey());
            byte[] decryptedBytes = cipher.doFinal(Hex.decodeHex(message));
            return new String(decryptedBytes);
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (DecoderException e) {
            e.printStackTrace();
        }
        return "";
    }
java.lang.NoSuchMethodError: No static method decodeHex(Ljava/lang/String;)[B in class Lorg/apache/commons/codec/binary/Hex; or its super classes (declaration of 'org.apache.commons.codec.binary.Hex' appears in /system/framework/org.apache.http.legacy.boot.jar)
  • 我的模拟器在Pie,Oreo和Nougat上运行
  • 我的设备在牛轧糖和棉花糖上运行

1 个答案:

答案 0 :(得分:1)

某些Android版本包含Apache Commons编解码器库(1.3)的旧版本,其中decodeHex(String)方法尚不存在。尝试改为致电decodeHex(char[])。即像这样修改您的代码:

byte[] decryptedBytes = cipher.doFinal(Hex.decodeHex(message.toCharArray()));

这应该与commons-codec v1.3兼容。