10

我按照以下步骤导入了 commons-codec-1.10.jar:

  1. 在 de app 目录下创建了一个 libs 目录
  2. 手动复制 libs 目录中的 .jar
  3. 右键单击 android-studio 中的 .jar 并单击 Add as library

在我的 build.grade 中添加了这一行

compile fileTree(dir: 'libs', include: ['*.jar'])

在我的课堂上,我像这样导入了库:

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 类不在活动内,只是为了让它简短。我检查了库,确实 encodeBase64String 是静态的。所以我不知道该怎么做,我是java和android环境的新手。所以任何帮助将不胜感激

4

3 回答 3

13

代替

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;
 }
}
于 2015-11-11T21:02:06.637 回答
5

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

一种可能的解决方案是通过使用jarjar重新打包来更改库的命名空间。

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

于 2015-12-26T17:41:20.657 回答
2

好吧,只是告诉大家,我无法解决这个问题。我使用原生 android 库对 android.util.Base64 中的进行编码和解码

            String hash = Base64.encodeToString(hasheado.doFinal(json.getBytes()), Base64.DEFAULT);
于 2015-11-11T20:46:52.493 回答