【问题标题】:about mangled name of functions in c++关于 C++ 中函数名称的错位
【发布时间】:2016-01-28 19:13:05
【问题描述】:

我有一个封闭的源共享库,链接到来自 android 的 libmedia.so

但不幸的是,在 >android 5.0 ABI 中,google 所做的更改破坏了我的封闭源代码库(thanx google)

现在我有以下错误 --> dlopen failed cannot locate symbol "_ZN7android11MediaPlayer13setDataSourceEPKcPKNS_11KeyedVectorINS_7String8ES4_EE" referenced by "mylib.so"

然后我对我的封闭源代码库(mylib.so)进行了十六进制编辑以加载 myhack.so(我自己构建的)而不是 libmedia.so(所以我只是做了一个技巧)

这里是 myhack.so 库的 Android.mk:

include $(CLEAR_VARS)
LOCAL_SRC_FILES := hack.cpp
LOCAL_SHARED_LIBRARIES := libmedia
LOCAL_MODULE := myhack
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
include $(BUILD_SHARED_LIBRARY)

这里是 hack.cpp:

extern "C" void _ZN7android11MediaPlayer13setDataSourceERKNS_2spINS_17IMediaHTTPServiceEEEPKcPKNS_11KeyedVectorINS_7String8ES9_EE();
extern "C" void _ZN7android11MediaPlayer13setDataSourceEPKcPKNS_11KeyedVectorINS_7String8ES4_EE() {
    return _ZN7android11MediaPlayer13setDataSourceERKNS_2spINS_17IMediaHTTPServiceEEEPKcPKNS_11KeyedVectorINS_7String8ES9_EE();
}

让我解释一下:

1-正如我所说,我对封闭源库进行了十六进制编辑以加载 myhack.so 而不是 libmedia.so(myhack.so 的源文件和 android.mk 文件在上面)

2-我将 myhack.so 链接到 libmedia.so(如您所见)以通过 myhack.so 提供其他 libmedia 功能

LOCAL_SHARED_LIBRARIES := libmedia

3- 丢失符号:_ZN7android11MediaPlayer13setDataSourceEPKcPKNS_11KeyedVectorINS_7String8ES4_EE

libmedia.so 中的当前符号:_ZN7android11MediaPlayer13setDataSourceERKNS_2spINS_17IMediaHTTPServiceEEEPKcPKNS_11KeyedVectorINS_7String8ES9_EE

所以如果调用丢失的符号,它将返回原始函数

我的问题是我应该使用 extern "C" void 还是 extern "C" int..... int 还是 void?哪一个? setDataSource 是一个函数,我认为它不会返回整数值,所以它应该是 void 我认为但我不是 %100 肯定

有人可以帮帮我吗?谢谢

【问题讨论】:

  • 这从一开始就是个坏主意。
  • @CaptainObvlious 是的,我知道,但不幸的是,我使用的 lib 是封闭源代码 :( 所以我没有太多选择。我可以找到这个解决方法(我知道很hacky)

标签: android c++ function


【解决方案1】:

迟早你会遇到麻烦。我记得我从事的项目中的滑雪问题。一些供应商正在对接口进行小的更改,这导致了各种崩溃。

要查找返回类型,您可以调查 android 的来源,步骤如下:

您可以使用https://demangler.com/,查看您的函数签名,应该是:

android::MediaPlayer::setDataSource(android::sp<android::IMediaHTTPService> const&, char const*, android::KeyedVector<android::String8, android::String8> const*)

现在让我们在安卓资源中搜索这样的签名,你可以在这里找到它:

http://androidxref.com/6.0.1_r10/xref/frameworks/av/media/libmedia/mediaplayer.cpp#148

所以它的返回类型是status_t,也就是typedef int status_t;,所以你假设它是int

【讨论】:

  • 非常感谢..我现在明白了..所以返回类型应该是“int”是的..会试试看..
猜你喜欢
  • 2011-03-16
  • 2023-03-31
  • 2018-03-27
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多