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

时间:2015-11-03 14:57:09

标签: java android android-studio static-methods android-runtime

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

  1. 在de app目录下创建了一个libs目录
  2. 手动复制libs目录中的.jar
  3. 右键单击android-studio中的.jar,然后单击Add as library
  4. 在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环境中的新手。所以任何帮助都会非常感激

3 个答案:

答案 0 :(得分:7)

替换

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;
 }
}

答案 1 :(得分:3)

Android框架包括类路径上的commons-codec库的古代版本(1.3)。在运行时,它将使用其类而不是与您的应用程序打包的类。 1.4引入了Base64#encodeBase64String方法,因此您收到了java.lang.NoSuchMethodError例外情况。

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

请参阅我的blogpost更详细地解释该问题,并说明如何重新打包库。

答案 2 :(得分:1)

告诉大家,我无法解决这个问题。我使用原生的android库进行编码和解码,它位于android.util.Base64

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