【发布时间】: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)