ı有来自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肯定
可以有人帮我吗?感谢名单答案 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;
。