在Android-ndk中,如何在调用dlclose()时调用_fini()?
In Android-ndk, How to make _fini( ) to be called when dlclose( ) is called?
我们在 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));
即使使用上一行中的 'destructor' 属性,_fini( ) 也不会在 dlclose( ) 上被调用。
由于 _init( ) 函数在 dlopen( ) 上被调用,我确信 _fini( ) 也应该在 dlclose( ) 上被调用,所以我应该遗漏了一些东西。我们正在使用 Android Studio 构建 apk。谁能帮我解决这个问题。提前致谢。
关于 dlclose
我能给出的最好建议是永远不要使用 dlclose
。
dlclose
除了通知 运行 它 可以 卸载库外,没有指定做任何事情; 运行时间不必对此做任何事情。对于实现卸载的系统(包括 Android)并不总是能够这样做,因为像 atexit
处理程序(或线程退出处理程序等)之类的东西在整个程序退出之前不能 运行 ,所以任何时候库注册这样的处理程序都不能卸载。这似乎是这里的情况。
确切的用例可能会导致答案有所不同,但对于我们已经看到的无法删除此类行为的情况(一个插件界面,其中插件应该卸载,然后重新加载它们的所有状态重置),修复方法是向库中添加显式 Initialize()
和 ShutDown()
函数。这些需要由库用户调用而不是依赖 dlopen
/dlclose
.
我们在 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));
即使使用上一行中的 'destructor' 属性,_fini( ) 也不会在 dlclose( ) 上被调用。
由于 _init( ) 函数在 dlopen( ) 上被调用,我确信 _fini( ) 也应该在 dlclose( ) 上被调用,所以我应该遗漏了一些东西。我们正在使用 Android Studio 构建 apk。谁能帮我解决这个问题。提前致谢。
关于 dlclose
我能给出的最好建议是永远不要使用 dlclose
。
dlclose
除了通知 运行 它 可以 卸载库外,没有指定做任何事情; 运行时间不必对此做任何事情。对于实现卸载的系统(包括 Android)并不总是能够这样做,因为像 atexit
处理程序(或线程退出处理程序等)之类的东西在整个程序退出之前不能 运行 ,所以任何时候库注册这样的处理程序都不能卸载。这似乎是这里的情况。
确切的用例可能会导致答案有所不同,但对于我们已经看到的无法删除此类行为的情况(一个插件界面,其中插件应该卸载,然后重新加载它们的所有状态重置),修复方法是向库中添加显式 Initialize()
和 ShutDown()
函数。这些需要由库用户调用而不是依赖 dlopen
/dlclose
.