android-discuss icon indicating copy to clipboard operation
android-discuss copied to clipboard

各位有没有遇到过 Module 库 之间 .so 文件的冲突吗

Open wozuihighwa opened this issue 8 years ago • 21 comments

目前项目嵌入了 高德地图3d地图,融云IMKit。之前遇到的一个问题是 高德地图 3d 所需要的 .so 文件放入 main/jnilibs 下依然报错找不到该文件,解决办法是在 gradle 中添加: sourceSets { main { jni.srcDirs = [] jniLibs.srcDirs = ['libs'] } } 在 libs 下添加相关文件夹并添加 .so 文件。(为什么这么奇葩呢= =)

目前的问题是:导入融云 Module 库,高德地图所需要的 .so 库又会提示找不到了。

wozuihighwa avatar Dec 08 '15 07:12 wozuihighwa

想请教下,这种问题有没有根本性的解决办法。 卡着这里怪难受的。

wozuihighwa avatar Dec 08 '15 07:12 wozuihighwa

如果是 Gradle 目录结构,把 so 文件放到 main/jniLibs 文件夹下,L 要大写

sourceSets {
    main {
        jni.srcDirs = []
        jniLibs.srcDirs = ['libs']
   }
}

这一块配置删掉

feicien avatar Dec 11 '15 02:12 feicien

这是在 Android Studio 下默认的存放地址。 但是添加 3d 高德地图到这个地址时运行时会报 找不到 对应 .so 文件。 解决的办法就是在 libs 文件夹中新建 armeabi 文件夹,并存放于此。 再添加上述语句到 gradle 中。

wozuihighwa avatar Dec 11 '15 05:12 wozuihighwa

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 目录的结构、以及其中的文件还有出错的日志贴出来,这样才能知道问题在哪儿。

kyleinfo avatar Dec 12 '15 10:12 kyleinfo

上述讨论还是没解决so冲突的问题吧,怎么在纠结so文件放哪里的的问题了...

tanweijiu avatar May 12 '16 15:05 tanweijiu

你可以试试依赖module工程生成的.aar文件,而不是依赖整个工程。前提是你的module工程确实可用。

tryBetter avatar May 12 '16 23:05 tryBetter

module工程可用也无效吧,gradle检测的是最终生成的app的so文件是否有冲突(我指的是最简单的那种第三方命名冲突)...使用aar也避免不了这个

tanweijiu avatar May 13 '16 03:05 tanweijiu

那你试试给两个工程设置不同的jniLibs.srcDirs目录呢?

tryBetter avatar May 13 '16 03:05 tryBetter

既然是冲突,那试着删掉其中一个试下

ipcjs avatar May 13 '16 03:05 ipcjs

找不到 so 的问题基本有两个:

1. 放错位置

as 默认存放的位置是 app/main/jniLibs/armeabi等平台不需要配置 gradle,如果你的位置不是这个,就需要配置 gradle 脚本了,推荐放到默认位置。

2. 平台不对应

之前遇到个坑,同时使用百度地图和百度导航,地图全平台都有so,而导航只有 armeabi,手机是64位,这样就会去加载 arm64-v8a 的so,而该目录没有导航的 so, 导致导航 so 找不到,进而导致导航引擎初始化失败。

因此多个 so 使用时,新建平台文件夹时,遵从最少平台原则,就是哪个 so 的平台最少,就只新建这些平台的文件夹。

jp1017 avatar May 13 '16 05:05 jp1017

@jp1017 这个问题不是找不到so,而是多个第三方库拥有相同命名的so文件造成冲突...

tanweijiu avatar May 13 '16 05:05 tanweijiu

@tanweijiu 这样啊, :smile: 该怎么解决呢? :eyes:

jp1017 avatar May 15 '16 11:05 jp1017

@tanweijiu @wozuihighwa 今天早上看到这个:

Android动态加载so文件(解决so文件冲突)

jp1017 avatar May 18 '16 00:05 jp1017

@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文件的正确加载顺序,如果随便顺序都可以那就更顺心啦..目前我也在考虑这个问题。如果可以从根本上解决就最好了

tanweijiu avatar May 18 '16 05:05 tanweijiu

@wozuihighwa 解决了module里含有相同名字第三方so库的问题了么?

loongwind avatar Aug 11 '16 06:08 loongwind

最终怎么解决的,同时引入两个三方sdk,同时含有相同的so的名称?

weihualiu avatar Jan 18 '21 08:01 weihualiu

这个问题太恶心了,今天用flutter构建,gradle也是报类似问题 libc++_shared.so重复,关键这个冲突还是两个第三方的module造成的,搜了一些方案,貌似只能改module的cmake,指定目录重新编译版本?

yunlianwangluo avatar Dec 01 '23 03:12 yunlianwangluo

感谢您的关注,我会尽快给您答复

hanyueziad avatar Dec 01 '23 03:12 hanyueziad

你好,邮件已收到,谢谢

nickalc avatar Dec 01 '23 03:12 nickalc

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

272664150 avatar Dec 01 '23 03:12 272664150

这是来自QQ邮箱的自动回复邮件。   您好,您的邮件已收到。如有后续我查收后会立刻联系您。如在假期,我将在假期结束后,尽快给您回复。

rotyan avatar Dec 01 '23 03:12 rotyan