Android Studio java.lang.NoSuchMethodError 带有导入的库
Android Studio java.lang.NoSuchMethodError with an imported library
我导入了 commons-codec-1。10.jar 按照以下步骤操作:
- 在de app目录下创建一个libs目录
- 手动复制libs目录下的.jar
- 右键单击 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,其中更详细地解释了该问题并展示了如何重新打包该库。
我导入了 commons-codec-1。10.jar 按照以下步骤操作:
- 在de app目录下创建一个libs目录
- 手动复制libs目录下的.jar
- 右键单击 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,其中更详细地解释了该问题并展示了如何重新打包该库。