Prior to Android-19 inclusive of NDK-s signal.h declared bsd_signal extern and signal was a built-in call to bsd_signal .
Starting with android-21, the signal is extern, and bsd_signal not declared at all.
Interestingly, bsd_signal is still available as a character in the NDK r10e android-21 libc.so (so when using r10e there were no binding errors) but it is not available in NDK r11 and higher.
Removing bsd_signal from NDK-s android-21 + libc.so results in error binding if the code built with android-21 + is linked to static libs built with a lower level of NDK that cause signal or bsd_signal . The most popular library that calls signal is OpenSSL .
WARNING : creating these static libraries with android-21 + (which would put the signal symbol directly) will bind a penalty, but will result in a *.so error for loading on older Android OS devices due to the signal symbol was not found in their libc.so .
Therefore, it is best to stick with <= android-19 for any code that calls signal or bsd_signal .
To link the library created using <android-21 , I declared a bsd_signal wrapper that will call bsd_signal from libc.so (it is still available on the libc.so device, even before Android 7.0).
#if (__ANDROID_API__ > 19) #include <android/api-level.h> #include <android/log.h> #include <signal.h> #include <dlfcn.h> extern "C" { typedef __sighandler_t (*bsd_signal_func_t)(int, __sighandler_t); bsd_signal_func_t bsd_signal_func = NULL; __sighandler_t bsd_signal(int s, __sighandler_t f) { if (bsd_signal_func == NULL) { // For now (up to Android 7.0) this is always available bsd_signal_func = (bsd_signal_func_t) dlsym(RTLD_DEFAULT, "bsd_signal"); if (bsd_signal_func == NULL) { // You may try dlsym(RTLD_DEFAULT, "signal") or dlsym(RTLD_NEXT, "signal") here // Make sure you add a comment here in StackOverflow // if you find a device that doesn't have "bsd_signal" in its libc.so!!! __android_log_assert("", "bsd_signal_wrapper", "bsd_signal symbol not found!"); } } return bsd_signal_func(s, f); } } #endif
PS. It looks like the bsd_signal character will be returned to libc.so in NDK r13 :
https://github.com/android-ndk/ndk/issues/160#issuecomment-236295994