【问题标题】:'ndk112' added in .so symbols when built on Android studio在 Android Studio 上构建时在 .so 符号中添加了“ndk112”
【发布时间】:2019-08-27 18:54:23
【问题描述】:

我正在使用 Android.mk 文件构建一个 Android 应用程序。我将此应用程序称为 A1。

我得到了一个具有实用程序功能的.so 文件形式的第三方本机库。我将把这个库称为 N1。 N1 由第三方供应商基于 Android Studio 构建。

当我在 A1 中包含 N1 并尝试使用 Android.mk 构建 A1 时,由于符号不匹配错误,编译失败。

当我检查符号不匹配时,区别如下:

一个。 Android Studio 生成的示例符号: _ZNSt6__ndk112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm

b. Android.mk 使用 A1 中存在的 N1 的头文件生成的相同符号: _ZNSt6__basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm

不同之处在于,N1 的每个符号中都添加了“ndk112”。如果我们在 Notepad++ 中打开 .so 文件,就可以看到这一点。

我进行了很多搜索以检查是否有任何标志可用于解决此问题,但无法获得任何参考。有人可以帮我从使用 Android Studio 生成的.so 文件的符号中删除“ndk112”。

【问题讨论】:

    标签: android cmake android-ndk android-source ndk-build


    【解决方案1】:

    https://stackoverflow.com/a/38798556/632035 的原因相同。 N1 和 A1 使用不同的 STL。它们必须使用相同的 STL。您需要使用 libc++ 重建 A1。

    【讨论】:

    • 我相信,在这种情况下,必须使用 APP_STL=c++_shared 重建 A1。 ndk1:: 命名空间是您对 libc++ 的期望,请参阅 stackoverflow.com/a/47051702/192373
    • 是的,他们倒退了。谢谢指正。
    • 我完全不明白如何进行。正如@AlexCohn 所说,我观察到 libc++.so 链接到基于 AOSP 构建的 N1.so 和 libc++_shared.so 链接到基于 Android Studio 构建的 N1.so。 N1 的 build.gradle 包含 externalNativeBuild { cmake { cppFlags "-std=c++11" arguments "-DANDROID_STL=c++_shared" } } 现在我不知道我必须在 Android.mk 中进行等效更改以实现正确的链接。
    • 您不应该为 N1 使用 AOSP 构建,除非您的目标是系统预安装的应用程序。至于A1:确保你使用最新的NDK版本;在 Android.mk 附近的 Application.mk 文件中或在 ndk-build 命令行中添加 APP_STL=c++_shared
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多