我正在尝试从生成的XXX.so
文件中查找功能符号,如下所示:
std::unique_ptr<void, int(*)(void*)> handle {
dlopen("/data/data/com.XXX.XXXXXXX/lib/libXXXEngine.so", RTLD_GLOBAL | RTLD_NOW),
&dlclose
};
constexpr char THREAD_KEY_NAME3[] = "CreateAppFeature";
void* const symbo3 = dlsym(handle.get(), THREAD_KEY_NAME3); // returns null
但是dlsym
返回了NULL
。以下是我在build.gradle
externalNativeBuild {
cmake {
version "3.10.2"
cppFlags "-std=c++17 -stdlib=libc++ -frtti -fexceptions"
arguments '-DANDROID_STL=c++_shared'
arguments '-DEXTLIBS_DIR=' + ext_lib_dir
arguments '-DEXTLIBS_DIR_ANDROID=' + ext_lib_dir_android
arguments '-DINSTALL_BIN_DIR=' + bin_dir
arguments '-DANDROID_PLATFORM=android-21'
}
}
我想念的是什么。请帮助我理解问题。
答案 0 :(得分:0)
如果未找到符号,则在指定的库中,或在加载该库时由dlopen()自动加载的任何库中,dlsym()返回NULL。
它返回NULL
表示找不到符号。
使用以下命令来检查符号名是否混乱(如果您的libXXXEngine.so
是C ++库):
# nm libXXXEngine.so | grep CreateAppFeature
然后将这个混杂的符号名称传递给您的dlsym
呼叫。