在非NDK编译条件下使用Android Log函数

解决的需求

有些时分不能在NDK环境编译,或者运用NDK编译会颇费周折,然后又想运用Android系统自带的Log类办法,那么咱们就可以运用dlopen来完成咱们的目的。比方在OpenCV中增加Android的Log打印。
关于dlopen
dlopen和dlclose对处理的lib进行引证计数,dlopen使引证计数加1,dlclose让引证计数减1,当对库的引证计数达到0的时分,才会把库unmap掉。
dlsym返回查找到的第一个符合要求的函数地址,该地址指的是库加载进进程虚拟地址。
可以运用dlsym来完成对库的前一个函数的隐藏。Therearetwospecialpseudo-handles,RTLD_DEFAULTandRTLD_NEXT.Theformerwillfindthefirstoccurrenceofthedesiredsymbolusingthedefaultlibrarysearchorder.Thelatterwillfindthenextoccurrenceofafunctioninthesearchorderafterthecurrentlibrary.Thisallowsonetoprovideawrapperaroundafunctioninanothersharedlibrary.
在调用了dlclose之后,再运用dlsym得到的函数是不行的。尽管当运用dlclose使得引证计数为0之后,系统并不会立马把加载的库给unmap掉,但是这个时间是不确定的。也许在你调用dlclose之后,在系统unmap之前调用dlsym的函数,或者本次dlclose并没有让引证计数为0,比方进程中还有其他地方也dlopen同一个库,那么系统也不会unmap,这样调用dlsym的函数并不会出错。
如果你想dlopen一个库之后,需要在程序中一直运用这个库的函数,那么没有必要调用dlclose,包括在程序退出之前调用dlclose。因为程序退出会主动unmap这些库。但是如果你要dlopen许多库,可能会导致虚拟地址缺乏的情况,那么就需要调用dlclose以保证不会出错。https://stackoverflow.com/questions/26131102/is-it-safe-to-call-dlclose-after-dlsym
代码
运用如下代码,完成根据dlopen的AndroidLog办法调用
#include#include#defineDLLOG_TAG”Slender3d”staticvoidlogd(constchar*format,…){#ifdef__aarch64__constcharlibpath[]=”/system/lib64/liblog.so”;#elseconstcharlibpath[]=”/system/lib/liblog.so”;#endifconstintANDROID_LOG_DEBUG=3;using__android_log_printFunc=int(*)(int,constchar*,constchar*,…);static__android_log_printFuncslogFunc=NULL;if(NULL==slogFunc){void*handler=dlopen(libpath,RTLD_NOW|RTLD_LOCAL);
dlerror();if(handler){constchar*SYM=”__android_log_print”;
slogFunc=reinterpret_cast(dlsym(handler,SYM));char*error;if((error=dlerror()!=NULL){
slogFunc=NULL;//LOGE(“dlsym%sfail”,libpath);}
}else{//LOGE(“dlopen%sfail”,libpath);}
}if(slogFunc){
va_listargs;
va_start(args,format);
slogFunc(ANDROID_LOG_DEBUG,DLLOG_TAG,format,args);
va_end(args);
}else{//LOGE(“dlsym%sfail”,SYM);}
}

© 版权声明
好牛新坐标
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章