gpt4 book ai didi

android - 关于 C++ 中的函数名

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:54 29 4
gpt4 key购买 nike

我已经关闭了从 android 链接到 libmedia.so 的源代码共享库

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

现在我有以下错误 --> dlopen 失败无法定位符号“_ZN7android11MediaPlayer13setDataSourceEPKcPKNS_11KeyedVectorINS_7String8ES4_EE”,由“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

所以如果lost symbol被调用,它会返回原来的函数

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

有人可以帮帮我吗?谢谢

最佳答案

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

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

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

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

现在让我们在 android 源中搜索这样的签名,您可以在这里找到它:

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

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

关于android - 关于 C++ 中的函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35069999/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com