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

Yas*_*svi 12 java android

com.nimbusds.jose.crypto在我的android客户端中使用库来做一些jwt的东西.

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

    compile 'com.nimbusds:nimbus-jose-jwt:4.23'
Run Code Online (Sandbox Code Playgroud)

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

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

这是什么问题?为什么AESENGINEapi 16上没有课程?

R. *_*ski 7

如果你查看dependecy列表,nimbus-jose-jwt那就没有bouncycastle库.但是,如果您查看源代码,更准确地说是com.nimbusds.jose.crypto.bc查看包,那么您可以看到它使用bouncycastle而不将其声明为依赖项.所以图书馆只是假设bouncycastle存在.

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

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

依赖{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'
}
Run Code Online (Sandbox Code Playgroud)

你应该注册java.security.Provider:

static {
    Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}
Run Code Online (Sandbox Code Playgroud)