首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android java.lang.NoClassDefFoundError: org.bouncycastle.crypto.engines.AESEngine api 16

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

Stack Overflow用户
提问于 2016-11-13 09:37:02
回答 3查看 7.4K关注 0票数 13

我在我的安卓客户端中使用com.nimbusds.jose.crypto库来做一些jwt内容。

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

代码语言:javascript
复制
    compile 'com.nimbusds:nimbus-jose-jwt:4.23'

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-20 14:50:20

如果查看nimbus-jose-jwt的依赖列表,则没有bouncycastle库。但是,如果您查看源代码,更精确地查看包com.nimbusds.jose.crypto.bc,那么您可以看到它使用bouncycastle而不声明为依赖项。因此,库只是假定存在bouncycastle

解决方案是手动添加依赖项。首先,遵循link实现在Android上使用bouncycastle的标准方法。

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

依赖项{ compile‘org.奖品城堡:bcprov-jdk15on:1.54’}

那么一切都会好的。

摘要:

gradle依赖关系应该类似于:

代码语言:javascript
复制
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

代码语言:javascript
复制
static {
    Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}
票数 15
EN

Stack Overflow用户

发布于 2017-01-25 10:16:27

Android是随BouncyCastle一起发布的。在API 16中,AESEngine类没有随Android一起提供(Android后来决定发布该类).Therefore,它无法找到该类。

但是,在编译时存在这个类,但在运行时是not.In --当您需要在API 16或API 16以下使用这个类时,您必须将该类/jar随APK一起发送。

除写作外

代码语言:javascript
复制
compile "com.madgag.spongycastle:prov:1.54.0.0"

你还得写这个

代码语言:javascript
复制
apk "com.madgag.spongycastle:prov:1.54.0.0"

这将将该类的范围从编译时扩展到APK,并且在Android的所有版本中都可以使用。

注意:为了避免类名冲突,您必须使用SpongyCastle而不是BouncyCastle。

票数 2
EN

Stack Overflow用户

发布于 2016-11-23 11:42:43

您的依赖关系尼姆-何塞-jwt没有声明的依赖于赏金城堡,因此,如果环境本身不提供赏金城堡版本,就会发生错误。这种情况发生在API版本16上。

虽然您可以说,这是库的一个问题,但这很可能是上完成的,因为Bouncy城堡可以用于不同的JDK版本。Bouncy城堡项目决定使用不同的伪名来反映不同的JDK版本,而不是在Bouncy城堡版本号中反映它。这导致了依赖关系管理方面的问题,因为版本解析器不承认不同版本实际上是相同的工件(从技术上讲,因为它们包含一组相同的类)。并且不能解决版本冲突,因此不能抛出版本解决错误,例如在不兼容的主要版本上。

org.bouncycastle bcprov-jdk16 16

org.bouncycastle bcprov-jdk15 15

org.bouncycastle bcprov-jdk14 14

这可能导致类路径上的赏金城堡出现多个并发版本,这反过来可能导致不可预测的类加载程序行为或不可预测的classNotFound /Symbol未找到错误(如果使用旧版本,则需要更新版本)。

解决方案很简单:

在gradle文件中显式地添加所需的依赖项,如下所示:

代码语言:javascript
复制
dependencies {compile 'org.bouncycastle:bcprov-jdk16:1.46'}

代码语言:javascript
复制
// https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16
compile group: 'org.bouncycastle', name: 'bcprov-jdk16', version: '1.46'

如果缺少更多的库,请尝试标识包含这些类的库(最简单的方法是搜索它们),并显式地添加它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40572436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档