Android:dlsym使用BOOST_DLL_ALIAS返回null

时间:2019-04-24 10:27:08

标签: android c++ boost cmake android-ndk

我正在尝试从生成的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

中的cmake配置
 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'

            }
        }

我想念的是什么。请帮助我理解问题。

1 个答案:

答案 0 :(得分:0)

来自dlsym manual page

  

如果未找到符号,则在指定的库中,或在加载该库时由dlopen()自动加载的任何库中,dlsym()返回NULL。

它返回NULL表示找不到符号。

使用以下命令来检查符号名是否混乱(如果您的libXXXEngine.so是C ++库):

# nm libXXXEngine.so | grep CreateAppFeature

然后将这个混杂的符号名称传递给您的dlsym呼叫。