Android jni调试打印char阵列的实例详解
Androidjni调试打印char阵列的实例详解
前言:
在android开发中,用jni有时候需要打印某一个字符串的二进制格式输出,比较友好的输出格式是一个四列,八列,十六列的矩阵格式。类似在错误删除野指针时出现如下错误:
pid:2721,tid:3005,name:pool-5-thread-5>>>onxmaps.hunt<<< signal11(SIGSEGV),code1(SEGV_MAPERR),faultaddrdeadbaad Abortmessage:'invalidaddressoraddressofcorruptblock0x7e31e028passedtodlfree' r000000000r14011917ar2deadbaadr34011cd0d r47e31e028r540127190r641b54000r77e31e030 r800000003r97ed97bb5sl00000001fp7ed97bb9 ip00000001sp82a7d9c0lr400ea873pc400ea874cpsr600f0030 d02064696c61766e69d12073736572646461 d2657264646120726fd36f6320666f207373 d43fd34413509f79fbd541568f570e698a86 d6412e848000000000d700000400fb561fc7 d87ff0000000000000d941568c0b304b0668 d10408f400000000000d110000000000000000 d120000000000000000d130000000000000000 d140000000000000000d150000000000000000 d16c07422af5ad9a77fd17010001ff0d000013 d186743a514430fcb23d19657fcd52992ddb94 d204820450ad34fbe9ed21a2fe0391c1ee451b d22bf5544b8ce928c56d23d4404b0a8749e7f1 d243fd5555555555555d25391377ce858a5d48 d26bca0000000000000d273940000000000000 d283ff0000000000000d29bef375cbdb605373 d30412e848000000000d313fd5555555555563 scr60000013 backtrace: #00pc00011874/system/lib/libc.so(dlfree+1191) #01pc0000dd13/system/lib/libc.so(free+10) #02pc00082485/system/lib/libcrypto.so(CRYPTO_free+24) #03pc0002aa85/system/lib/libssl.so(ssl_parse_serverhello_tlsext+244) #04pc00016bbd/system/lib/libssl.so(ssl3_get_server_hello+904) #05pc000196bf/system/lib/libssl.so(ssl3_connect+642) #06pc00024f55/system/lib/libssl.so(SSL_do_handshake+72) #07pc0000c67f/system/lib/libjavacrypto.so #08pc00020bcc/system/lib/libdvm.so(dvmPlatformInvoke+112) #09pc00051927/system/lib/libdvm.so(dvmCallJNIMethod(unsignedintconst*,JValue*,Methodconst*,Thread*)+398) #10pc0002a060/system/lib/libdvm.so #11pc00031510/system/lib/libdvm.so(dvmMterpStd(Thread*)+76) #12pc0002eba8/system/lib/libdvm.so(dvmInterpret(Thread*,Methodconst*,JValue*)+184) #13pc00063e75/system/lib/libdvm.so(dvmCallMethodV(Thread*,Methodconst*,Object*,bool,JValue*,std::__va_list)+336) #14pc00063e99/system/lib/libdvm.so(dvmCallMethod(Thread*,Methodconst*,Object*,JValue*,...)+20) #15pc00058b6b/system/lib/libdvm.so #16pc0000d278/system/lib/libc.so(__thread_entry+72) #17pc0000d410/system/lib/libc.so(pthread_create+240) codearoundpc: 400ea8546a01447862021e4af7fdb95ae008fd39 400ea8644621482a44784a2af001447a4a13f9b3 400ea87449286014f8d14479079a31bcf501d51c 400ea884e8bd70e0f02c40f84823b895f7fd4478 400ea8944822fd0de7fa447842b7688fae10f43f 400ea8a4481fe611e7f244784478481e6888e7ef 400ea8b4f43f4298e606aed4bf00bdf8deadbaad 400ea8c40003cdae0003cda00003cd080003283b 400ea8d40003cc7c0003cc6a0003cbf20003cbd0 400ea8e40003cb740003cb5e0003caf80003cae0 400ea8f40003cace0003ca760003ca500003c9c6 400ea9040003c9700003c9560003c9380002e90c 400ea9140003249d0003c9140003247900032471 400ea924000324610003245b460db538b1704601 400ea9340200ea45f405fb0004030c104620b143 400ea944ef24f028bf1842a834fff04f4604e000 codearoundlr: 400ea850482e61a36a01447862021e4af7fdb95a 400ea860e008fd394621482a44784a2af001447a 400ea8704a13f9b349286014f8d14479079a31bc 400ea880f501d51ce8bd70e0f02c40f84823b895 400ea890f7fd44784822fd0de7fa447842b7688f 400ea8a0ae10f43f481fe611e7f244784478481e 400ea8b06888e7eff43f4298e606aed4bf00bdf8 400ea8c0deadbaad0003cdae0003cda00003cd08 400ea8d00003283b0003cc7c0003cc6a0003cbf2 400ea8e00003cbd00003cb740003cb5e0003caf8 400ea8f00003cae00003cace0003ca760003ca50 400ea9000003c9c60003c9700003c9560003c938 400ea9100002e90c0003249d0003c91400032479 400ea92000032471000324610003245b460db538 400ea930b17046010200ea45f405fb0004030c10 400ea9404620b143ef24f028bf1842a834fff04f
谷歌的工程师非常老道,在codearoundpc以下就是一个五列矩阵,这种打印格式的可读性比较强。最近项目中需要使用加密算法,因此调试时打印矩阵是一种不错的选择。由于androidjni提供的接口时
__android_log_write
每次打印都会一行,不会像printf方便。因此需要对__android_log_write进行二次封装。思路就是先申请一段空间,然后把打印的内容存储在该内存中,最后log输出。
具体代码如下:
#include#include #include //一般定义在公共文件 #defineldebug(tag,format,...){__android_log_write(tag,format,##__VA_ARGS__);} #defineTAG"345" voidprint_matrix(char*text,size_tsize){//打印16列的矩阵 chartemp[16]={0}; size_tlines=(size+15)/16;//保证打印的整行的矩阵 lines=lines>0?lines:1;//最小为一 constsize_tLEN=lines*16*3+1;//给打印buf申请足够的buffer。乘3是因为打印时传入的每个字符char字符占三个位置。见注释AB char*buf=(char*)malloc(LEN*sizeof(char)); if(NULL==buf){ return; } memset(buf,0,LEN); intn=0; for(size_ti=0;i 0&&i>0){ strcat(buf,"");//注释A:占一个字符 } memset(temp,0,16); if(i 测试调用代码
voidtestPrintMatrix(){ chartemp[]="Hello,thisisprint_matrix'stestcase."; print_matrix(temp,sizeof(temp)); }输出结果
08-0318:46:03.101D/345(30611):testPrintMatrix 08-0318:46:03.101D/345(30611):48656c6c6f2c20746869732069732070 08-0318:46:03.101D/345(30611):72696e745f6d61747269782773207465 08-0318:46:03.101D/345(30611):737420636173652e0000000000000000说明,因为使用
记得在Android.mk添加 LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib-llog如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。