android-discuss
android-discuss copied to clipboard
各位有没有遇到过 Module 库 之间 .so 文件的冲突吗
目前项目嵌入了 高德地图3d地图,融云IMKit。之前遇到的一个问题是 高德地图 3d 所需要的 .so 文件放入 main/jnilibs 下依然报错找不到该文件,解决办法是在 gradle 中添加: sourceSets { main { jni.srcDirs = [] jniLibs.srcDirs = ['libs'] } } 在 libs 下添加相关文件夹并添加 .so 文件。(为什么这么奇葩呢= =)
目前的问题是:导入融云 Module 库,高德地图所需要的 .so 库又会提示找不到了。
想请教下,这种问题有没有根本性的解决办法。 卡着这里怪难受的。
如果是 Gradle 目录结构,把 so 文件放到 main/jniLibs 文件夹下,L 要大写
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
这一块配置删掉
这是在 Android Studio 下默认的存放地址。 但是添加 3d 高德地图到这个地址时运行时会报 找不到 对应 .so 文件。 解决的办法就是在 libs 文件夹中新建 armeabi 文件夹,并存放于此。 再添加上述语句到 gradle 中。
sourceSets {} 是用来对资源文件进行映射的,我一般只在需要 Eclipse 与 Android studio 协同的项目里才会使用它,因为 Eclipse 的项目结构与 Android Studio 的项目结构是不同的。通过配置 sourceSets {} 可以使项目同时兼容 Eclipse 与 Android Studio 两种项目结构。 如果你在 android studio 的 main/jnilibs 添加 so 文件,运行时找不到,然后设置
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
之后就找到了,那么几乎可以确定,你一开始在 android studio 里添加错了,因为 sourceSets {} 是用来做映射的,它并不是什么黑魔法。
你应该将你项目的 main/jniLib 目录,libs 目录的结构、以及其中的文件还有出错的日志贴出来,这样才能知道问题在哪儿。
上述讨论还是没解决so冲突的问题吧,怎么在纠结so文件放哪里的的问题了...
你可以试试依赖module工程生成的.aar文件,而不是依赖整个工程。前提是你的module工程确实可用。
module工程可用也无效吧,gradle检测的是最终生成的app的so文件是否有冲突(我指的是最简单的那种第三方命名冲突)...使用aar也避免不了这个
那你试试给两个工程设置不同的jniLibs.srcDirs目录呢?
既然是冲突,那试着删掉其中一个试下
找不到 so 的问题基本有两个:
1. 放错位置
as 默认存放的位置是 app/main/jniLibs/armeabi等平台
,不需要配置 gradle
,如果你的位置不是这个,就需要配置 gradle
脚本了,推荐放到默认位置。
2. 平台不对应
之前遇到个坑,同时使用百度地图和百度导航,地图全平台都有so,而导航只有 armeabi
,手机是64位,这样就会去加载 arm64-v8a
的so,而该目录没有导航的 so, 导致导航 so 找不到,进而导致导航引擎初始化失败。
因此多个 so 使用时,新建平台文件夹时,遵从最少平台原则,就是哪个 so 的平台最少,就只新建这些平台的文件夹。
@jp1017 这个问题不是找不到so,而是多个第三方库拥有相同命名的so文件造成冲突...
@tanweijiu 这样啊, :smile: 该怎么解决呢? :eyes:
@jp1017 @wozuihighwa 这个是我之前在http://stackoverflow.com/questions/37200853/how-to-fix-the-libgnustl-shared-so-file-duplicated-which-in-third-party-sdks 提过的问题,最后还是自问自答了...其实跟你提的那个这个方案思路是一样的。之前在简书上一看到一样的文章(咱不讨论百川抄袭啦)...但是实际上,我们会忽略了一种情况,那就是,两个so文件的加载顺序的问题也会造成bug..比如,我前些天试过了(项目里集成的趣拍sdk跟reactnative的sdk里都有那个gnustl的so文件,必须先加载趣拍的再加载rn的,顺序反了也会出错..)。所以使用这个方案的,还得自己测试一下冲突so文件的正确加载顺序,如果随便顺序都可以那就更顺心啦..目前我也在考虑这个问题。如果可以从根本上解决就最好了
@wozuihighwa 解决了module里含有相同名字第三方so库的问题了么?
最终怎么解决的,同时引入两个三方sdk,同时含有相同的so的名称?
这个问题太恶心了,今天用flutter构建,gradle也是报类似问题 libc++_shared.so重复,关键这个冲突还是两个第三方的module造成的,搜了一些方案,貌似只能改module的cmake,指定目录重新编译版本?
感谢您的关注,我会尽快给您答复
你好,邮件已收到,谢谢
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
这是来自QQ邮箱的自动回复邮件。 您好,您的邮件已收到。如有后续我查收后会立刻联系您。如在假期,我将在假期结束后,尽快给您回复。