我在应用程序的两个单独的模块中使用两个不同的自定义 aar 库。库附带了许多“.so”文件 - 例如“libc++_shared.so”等。在包含这两个文件后,我收到如下错误:
2 files found with path 'lib/arm64-v8a/libc++_shared.so' from inputs
所以我用了:
packagingOptions {
pickFirst
}
不幸的是,对于我来说这不是一个好的解决方案,因为现在运行应用程序后我得到:
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "vpx_codec_enc_config_default" referenced by "[...]/base.apk!/lib/arm64-v8a/libmediaengine.so"...
有什么解决方案可以让我在不同版本的不同模块中使用两个相同的 .so 文件吗?
当您在应用程序中包含两个包含相同 .so 文件的不同自定义 aar 库时,您可能会遇到链接器无法决定使用哪个版本的 .so 文件的问题。解决此问题的一种方法是对每个库中的 .so 文件使用不同的名称,例如libc++_shared_v1.so
and libc++_shared_v2.so
。这样,链接器就会知道每个库要使用哪个版本的 .so 文件。
另一个解决方案是为您的应用程序使用不同的构建类型或风格。这样您就可以为每种构建类型或风格包含不同版本的 .so 文件。例如,您可以有一个debug
使用第一个库和一个的构建类型release
使用第二个库的构建类型。
您还可以使用自定义链接描述文件来指定要使用的 .so 文件版本。此脚本可用于覆盖默认链接器行为,并且您可以使用它来指定每个库使用哪个版本的 .so 文件。
值得一提的是,使用自定义链接器脚本的解决方案并不总是那么容易,它需要一些 android NDK 和 JNI 的经验,并且在尝试此解决方案之前熟悉 android 构建过程非常重要。
综上所述,在android中的不同模块中使用相同.so文件的不同版本有多种解决方案。这取决于您的用例以及您愿意实施的解决方案的复杂性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)