android - 在Android-ndk中,如何在调用dlclose()时调用_fini()?

标签 android c android-ndk

我们在 Android-NDK 项目中使用 C 库。我们正在使用 dlopen( ) 和 dlclose( ) 来处理我们在 Android NDK 中的库。当我们调用 dlopen() 时,库的 _init() 会按预期被调用。但相反,当我们使用 dlclose() 调用关闭库时,_fini() 函数不会被调用。我们不想在调用 dlclose() API 后显式调用 _fini() 函数。我正在 API 24 上测试这些。

根据 linux,当我们分别调用 dlopen() 和 dlclose() 时,应该调用两个函数 _init( ) 和 _fini( )。

void func( ){
...
   int ret = -1;
   handle = dlopen( "mylib.so", RTLD_NOW | RTLD_GLOBAL );
   ret = dlclose( handle );    // dlclose() is returning 0.
...
}

void _init( ){
   log("dlopen is loading the library");
}

void _fini( ){
   log("dlclose is unloading the library");
}

我也试过如下更改 _fini( ) 的语法,但没有成功。

void _fini() __attribute__((destructor));

即使使用上一行中的“析构函数”属性,_fini( ) 也不会在 dlclose( ) 上被调用。

由于 _init( ) 函数在 dlopen( ) 上被调用,我确信 _fini( ) 也应该在 dlclose( ) 上被调用,所以我应该遗漏了一些东西。我们正在使用 Android Studio 构建 apk。谁能帮我解决这个问题。提前致谢。

最佳答案

关于 dlclose,我能给出的最好建议是永远不要使用 dlclose

dlclose 除了通知运行时它可能卸载库外,没有指定做任何事情;运行时不必对此做任何事情。对于实现卸载的系统(包括 Android)并不总是能够这样做,因为像 atexit 处理程序(或线程退出处理程序等)在整个程序退出之前无法运行,所以任何时候库注册了这样一个无法卸载的处理程序。这似乎是这里的情况。

确切的用例可能会导致答案有所不同,但对于我们已经看到的无法删除此类行为的情况(一个插件接口(interface),插件应该卸载,然后重新加载所有状态重置) ,修复方法是向库中添加显式 Initialize()ShutDown() 函数。这些需要由库用户调用,而不是依赖于 dlopen/dlclose

关于android - 在Android-ndk中,如何在调用dlclose()时调用_fini()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56522118/

相关文章:

c - Flash 中的两个不同程序

c++ - C格式说明符问题

c - 函数中的 Malloc 和 free(优化你的内存)

Android - 如何保存以编程方式创建的 View 并在应用重启时恢复它

android - 如何在我的共享库中包含正确的包含文件以使用 libdvm.so?

android - 编译 ffmpeg 库和转换器类时遇到问题

android - 如何在android中编译ARM v7I的模块?

java - 创建自定义分页指示器

android - "error.GitError: remote has no review url"遇到 Gerrit/repo

android - mono droid 和 mvvm cross 的奇怪异常无法解析 IoC 类型