Android Studio java.lang.NoSuchMethodError con una biblioteca importada

He importado commons-codec-1.10.jar siguiendo los siguientes pasos:

  1. En el directorio de aplicaciones se creó un directorio libs
  2. Copiado manualmente el archivo .jar dentro del directorio libs
  3. Haga clic con el botón derecho en el .jar dentro de android-studio y haga clic en Añadir como biblioteca

Añadido esta línea en mi build.grade

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

En mi clase importé la biblioteca de esta manera:

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

Entonces intenté tener acceso al método estático encodeBase64String dentro de Base64 como esto:

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

No hay nada malo allí, incluso cuando compilar, excepto cuando ejecuto la aplicación, lanza el siguiente error y la aplicación se cierra:

 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) 

Mi clase DoThisThing no está dentro de la actividad por cierto, es sólo para hacerla corta. Comprobé la biblioteca y de hecho el encodeBase64String es estático. Así que no sé exactamente qué hacer, soy nuevo en el entorno de java y android. Así que cualquier ayuda sería muy apreciada

3 Solutions collect form web for “Android Studio java.lang.NoSuchMethodError con una biblioteca importada”

Reemplazar

 org.apache.commons.codec.binary.Base64 

para

 android.util.Base64 

Y actualizar su método como este.

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

Bueno, solo para decirles a todos, no pude resolver este problema. He utilizado la biblioteca nativa de Android para codificar y decodificar lo que está en el android.util.Base64

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

El framework de Android incluye la versión antigua (1.3) de la biblioteca commons-codec en un classpath. En tiempo de ejecución, utilizará su clase en lugar de la que está empaquetada con su aplicación. Base64#encodeBase64String método de Base64#encodeBase64String se introdujo en 1.4 y por lo tanto está recibiendo la excepción java.lang.NoSuchMethodError .

Una posible solución será cambiar el espacio de nombres de la biblioteca reempaquetándolo usando jarjar .

Vea mi blogpost que explica el problema con más detalle y muestra cómo volver a empaquetar la biblioteca.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.