android java.lang.NoClassDefFoundError: org.bouncycastle.crypto.engines.AESEngine api 16

2022-09-04 20:05:59

我正在我的Android客户端中使用库来做一些jwt的事情。com.nimbusds.jose.crypto

这是我在我的gradle文件中声明的内容:

    compile 'com.nimbusds:nimbus-jose-jwt:4.23'

在api上一切正常>= 19,但是当我在api 16上运行代码时,我得到这个异常:

java.lang.NoClassDefFoundError: org.bouncycastle.crypto.engines.AESEngine.

这是什么问题?为什么该类在 api 16 上不可用?AESENGINE


答案 1

如果你查看nimbus-jose-jwt的依赖列表,没有库。但是,如果您查看源代码,并且更准确地查看包,那么您可以看到,它使用而不将其声明为依赖项。因此,库只是假设存在。bouncycastlecom.nimbusds.jose.crypto.bcbouncycastlebouncycastle

解决方案是手动添加依赖项。首先,按照链接在Android上实现标准使用方式。bouncycastle

但是,这并不能解决问题,因为不在其中一个库中。解决方案是再添加一个依赖项:org.bouncycastle.crypto.engines.AESEngine

dependencies { compile 'org.bouncycastle:bcprov-jdk15on:1.54' }

然后一切都应该工作正常。

总结:

gradle依赖关系应该像这样徘徊:

dependencies {
    compile 'com.nimbusds:nimbus-jose-jwt:4.23'
    compile 'com.madgag.spongycastle:core:1.54.0.0'
    compile 'com.madgag.spongycastle:prov:1.54.0.0'
    compile 'com.madgag.spongycastle:pkix:1.54.0.0'
    compile 'com.madgag.spongycastle:pg:1.54.0.0'
    compile 'org.bouncycastle:bcprov-jdk15on:1.54'
}

您应该注册:java.security.Provider

static {
    Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}

答案 2

Android OS附带了BouncyCastle已经存在于其中。在API级别16中,AESEngine类没有随Android操作系统一起发布(Android决定稍后发布该类)。因此,它找不到该类。

但是,在编译时,此类存在,但在运行时它不存在。在这种情况下,当您需要在 API 16 或以下使用此类时,您必须随 APK 一起提供该类/jar。

除了写作

compile "com.madgag.spongycastle:prov:1.54.0.0"

你也必须写这个

apk "com.madgag.spongycastle:prov:1.54.0.0"

这将把这个类的范围从编译时扩展到APK,这将在所有版本的Android中都可用。

注意:您必须使用海绵城堡而不是弹跳城堡来避免类名冲突。


推荐