Android Studio java.lang.NoSuchMethodError 带有导入的库

Android Studio java.lang.NoSuchMethodError with an imported library

我导入了 commons-codec-1。10.jar 按照以下步骤操作:

  1. 在de app目录下创建一个libs目录
  2. 手动复制libs目录下的.jar
  3. 右键单击 android-studio 中的 .jar,然后单击添加为库

在我的 build.grade

中添加了这一行
compile fileTree(dir: 'libs', include: ['*.jar'])

在我的 class 中,我导入了这样的库:

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

然后我尝试访问 Base64 中的 encodeBase64String 静态方法,如下所示:

public static class DoThisThing {
    public String DoThisOtherThing() {
        String hashed = "hello";
        String hash = Base64.encodeBase64String(hashed.getBytes());
        return hash;
    }
}

public class ActivityThing extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_thing);
        String hash = DoThisThing.DoThisOtherThing();
        System.out.println(hash);
    }
}

没有问题,即使我编译时,除了当我 运行 应用程序时,它抛出以下错误并且应用程序关闭:

11-03 09:41:27.719 2390-2476/com.myproject E/AndroidRuntime:  Caused by: 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)

顺便说一下,我的 DoThisThing class 不在 activity 里面,只是为了让它更短。我检查了库,encodeBase64String 确实是静态的。所以我不知道该怎么做,我是 java 和 android 环境中的新手。所以任何帮助将不胜感激

好吧,告诉大家,我没能解决这个问题。我使用本机 android 库来编码和解码 android.util.Base64

            String hash = Base64.encodeToString(hasheado.doFinal(json.getBytes()), Base64.DEFAULT);

替换

org.apache.commons.codec.binary.Base64 

为了

android.util.Base64

并像这样更新你的方法。

public static class DoThisThing {
 public String DoThisOtherThing() {
    String hashed = "hello";
    byte[] data = hashed.getBytes("UTF-8");
    String hash = Base64.encodeToString(data, Base64.DEFAULT);
    return hash;
 }
}

Android 框架在 class 路径上包含旧版本 (1.3) 的 commons-codec 库。在运行时,它将使用其 class 而不是与您的应用程序一起打包的那个。 Base64#encodeBase64String 方法是在 1.4 中引入的,因此您会收到 java.lang.NoSuchMethodError 异常。

一种可能的解决方案是通过使用 jarjar.

重新打包来更改库的命名空间

请参阅我的 blogpost,其中更详细地解释了该问题并展示了如何重新打包该库。