有些時候不能在NDK環境編譯,或者使用NDK編譯會頗費周折,而後又想使用Android系統自帶的Log類方法,那麼咱們就可使用dlopen來實現咱們的目的。好比在OpenCV中添加Android的Log打印。android
使用以下代碼,實現基於dlopen
的Android Log方法調用app
#include <dlfcn.h> #include <stdarg.h> #define DLLOG_TAG "Slender3d" static void logd( const char* format, ...) { #ifdef __aarch64__ const char libpath[] = "/system/lib64/liblog.so"; #else const char libpath[] = "/system/lib/liblog.so"; #endif const int ANDROID_LOG_DEBUG = 3; using __android_log_printFunc = int(*)(int , const char* , const char* , ...); static __android_log_printFunc slogFunc = NULL; if(NULL == slogFunc){ void *handler = dlopen(libpath, RTLD_NOW | RTLD_LOCAL); dlerror(); if (handler) { const char *SYM = "__android_log_print"; slogFunc = reinterpret_cast<__android_log_printFunc>(dlsym(handler, SYM)); char *error; if( (error = dlerror() != NULL){ slogFunc = NULL; //LOGE("dlsym %s fail", libpath); } } else { //LOGE("dlopen %s fail", libpath); } } if (slogFunc) { va_list args; va_start(args, format); slogFunc(ANDROID_LOG_DEBUG, DLLOG_TAG, format, args); va_end(args); } else { //LOGE("dlsym %s fail", SYM); } }