Android Kotlin项目引入Assimp库遭遇重复类错误求助
问题描述
我正在用Kotlin开发一款Android应用,核心功能是读取PLY文件并通过OpenGL进行渲染。为解决模型文件读取问题,我尝试了Assimp库的多种集成方案:
- 从源码构建时遇到JNI绑定相关问题,无法正常集成;
- 使用MavenCentral上的Assimp相关包,要么功能不全,要么运行时出现随机异常;
- 最终选择了kotlin-graphics/assimp仓库的JAR包尝试,将其放入项目
libs目录后,在build.gradle.kts中添加了如下依赖:
implementation(files("libs/assimp.jar"))
使用的是该仓库v4.0版本的assimp-all.jar。
遇到的错误
集成后编译时出现大量重复类错误,示例如下:
Duplicate class kotlin.ArrayIntrinsicsKt found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.Deprecated found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.DeprecationLevel found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.DslMarker found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.ExceptionsKt found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.ExceptionsKt__ExceptionsKt found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.ExtensionFunctionType found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.Function found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) Duplicate class kotlin.InitializedLazyImpl found in modules assimp.jar -> assimp (assimp.jar) and kotlin-stdlib-1.9.0.jar -> kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0)
解决方案
方法1:使用Gradle依赖并排除冲突的Kotlin标准库
如果可以通过Maven依赖引入该库,建议替换本地JAR依赖为如下配置,直接排除JAR中打包的Kotlin标准库:
implementation("com.github.kotlin-graphics:assimp:4.0") { exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") }
这样既能引入Assimp功能,又不会和项目自带的kotlin-stdlib产生冲突。
方法2:通过ProGuard规则排除重复类
如果必须使用本地JAR包,可在proguard-rules.pro中添加以下规则,排除冲突的Kotlin标准库类,同时保留Assimp相关类:
# 忽略Kotlin标准库类的警告 -dontwarn kotlin.** # 保留Assimp核心类 -keep class com.github.kotlin_graphics.assimp.** { *; } -keep class ai.** { *; } # 排除冲突的Kotlin标准库类(可根据错误信息补充更多类) -dontkeep kotlin.ArrayIntrinsicsKt -dontkeep kotlin.Deprecated -dontkeep kotlin.DeprecationLevel -dontkeep kotlin.DslMarker -dontkeep kotlin.ExceptionsKt -dontkeep kotlin.ExceptionsKt__ExceptionsKt -dontkeep kotlin.ExtensionFunctionType -dontkeep kotlin.Function -dontkeep kotlin.InitializedLazyImpl
添加规则后,确保在build.gradle.kts中启用了ProGuard(通常在release构建中默认启用,debug构建可手动开启)。
内容的提问来源于stack exchange,提问作者juliano.net
相关产品推荐
相关产品推荐

