关于c ++中函数的错位名称

时间:2016-01-28 19:13:06

标签: android c++ function

ı有来自android

的libmedia.so链接的源代码共享库

但在> android 5.0 ABI更改中,谷歌打破了我的封闭源库(谷歌浏览器),这是不可原谅的

现在有以下错误 - > 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 - 就像我说的那样,我用我的封闭源代码lib来加载myhack.so而不是libmedia.so(myhack.so的源文件和android.mk文件在上面)

2-I我将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肯定

可以有人帮我吗?感谢名单

1 个答案:

答案 0 :(得分:1)

迟早你会对它不屑一顾。我记得在我工作的项目上skia的问题。一些供应商正在使用接口进行小的更改,这导致了各种崩溃。

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

您可以使用https://demangler.com/来查看您的功能的签名,它应该是:

detail

现在可以搜索Android源代码以获得此类签名,您可以在此处找到它:

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

因此其返回类型为android::MediaPlayer::setDataSource(android::sp<android::IMediaHTTPService> const&, char const*, android::KeyedVector<android::String8, android::String8> const*) ,即status_t,因此您已假定其为typedef int status_t;