Reputation: 398
I imported the commons-codec-1.10.jar following the next steps:
Added this line in my build.grade
compile fileTree(dir: 'libs', include: ['*.jar'])
In my class I imported the library like this:
import org.apache.commons.codec.binary.Base64;
Then I tried to access the encodeBase64String static method inside Base64 like this:
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);
}
}
Nothing wrong there, even when I compile, except when I run the app, it throws the following error and the app shuts:
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)
My DoThisThing class is not inside the activity by the way, it's just to make it short. I checked the library an indeed the encodeBase64String is static. So I don't know exactly what to do, I'm new in the java and android environment . So any help would be much appreciated
Upvotes: 10
Views: 11104
Reputation: 13958
Android framework includes ancient version (1.3) of commons-codec library on a classpath. In runtime, it will use its class instead of the one that packaged with your app. Base64#encodeBase64String
method was introduced in 1.4 and therefore you're receiving the java.lang.NoSuchMethodError
exception.
One possible solution will be to change the library's namespace by repackaging it using jarjar.
See my blogpost that explains the issue in more detail and shows how to repackage the library.
Upvotes: 5
Reputation: 376
Replace
org.apache.commons.codec.binary.Base64
for
android.util.Base64
And update your method like this.
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;
}
}
Upvotes: 13
Reputation: 398
Well just to tell everyone, I wasn't able to solve this problem. I used the native android library to encode and decode which is in the android.util.Base64
String hash = Base64.encodeToString(hasheado.doFinal(json.getBytes()), Base64.DEFAULT);
Upvotes: 2