这篇文章主要介绍了Android jni调试打印茶阵列的实例详解的相关资料,通过此文希望能帮助到大家实现这样的功能,需要的朋友可以参考下
Android jni调试打印char阵列的实例详解
前言:
在机器人开发中,用jni有时候需要打印某一个字符串的二进制格式输出,比较友好的输出格式是一个四列,八列,十六列的矩阵格式。类似在错误删除野指针时出现如下错误:
pid: 2721,tid: 3005,名称:pool-5-thread-5 onxmaps.hunt
信号11(西格夫),代码1 (SEGV_MAPERR),故障地址死区
中止消息:"传递给dlfree的无效地址或损坏块的地址0x7e31e028 "
r0 00000000 R1 4011917 a R2死亡baad R3 4011 cd0d
R4 7e 31 e 028 r5 40127190 R6 41b 54000 r7 7e 31 e 030
r8 00000003 r9 7版97 bb 5 sl 00000001 FP 7版97 bb 9
IP 00000001 sp 82a 7 d9 c 0 lr 400 ea 873 PC 400 ea 874 cpsr 600 f 0030
D1 2073736572646461
D2 657264646120726 f D3 6f 6320666 f 207373
D4 3fd 34413509 f 79 FB D5 41568 f 570 e 698 a86
D6 412 e 848000000000 D7 00000400 FB 561 fc 7
D8 7ff 0000000000000 d9 41568 c0b 304 b 0668
D10 408 f 4000000000000d 110000000000000
d12
14 000 000 000 000 000 000
d16 c 07422 af 5a d9 a 77 f d17 010001 ff0d 000013
DDB 94
d20 4820450 ad 34 FBE 9 e d21 a2 Fe 0391 C1 ee 451 b
d22 BF 5544 b 8 ce 928 c 56 d23 d 4404 b 0a 8749 e 7f 1
d24 3fd 5555555555555 d25 391377 ce 858 a5d 48
BCA
d28 3ff 000000000000 d29 bef 375 cbdb 605373
d30 412 e 84800000000 d31 3fd 555555555555563
scr 60000013
回溯:
# 00 PC 00011874/system/lib/libc。so(dl免费1191)
# 01 PC 0000 DD 13/system/lib/libc。所以(免费10)
# 02 PC 00082485/system/lib/lib加密。so(CRYPTO _ free 24)
# 03 PC 0002 aa 85/system/lib/libssl。so(SSL _ parse _ server hello _ TLS ext 244)
# 04 PC 00016 bbd/system/lib/libssl。所以(SSL 3 _ get _ server _ hello 904)
# 05 PC 000196 BF/system/lib/libssl。so(SSL 3 _ connect 642)
# 06 PC 00024 f55/system/lib/libssl。so(SSL _ do _ handshake 72)
# 07 PC 0000 c67f/system/lib/libjavacrypto。因此
# 08 PC 00020 bcc/system/lib/lib dvm。所以(dvmPlatformInvoke 112)
# 09 PC 00051927/system/lib/lib dvm。so(dvmCallJNIMethod(unsigned int const *、JValue*、方法const *、Thread*) 398)
# 10 PC 0002 a060/system/lib/lib dvm。因此
# 11 PC 00031510/system/lib/lib dvmso(dvmMterpStd(Thread *)76)
# 12 PC 0002 EBA 8/系统/库/库dvm。so(dvmInterpret(Thread *、方法常量*、JValue*) 184)
# 13 PC 00063 e 75/system/lib/lib dvm。so(dvmCallMethodV(Thread *、Method const*、Object*、bool、JValue*、std:__va_list) 336)
# 14 PC 00063 e 99/system/lib/lib dvm。所以(dvmCallMethod(Thread *,Method const*,Object*,JValue*,) 20)
# 15 PC 00058 b6b/system/lib/lib dvm。因此
# 16 PC 0000d 278/system/lib/libc所以(_ _ thread _ entry 72)
# 17 PC 0000 d410/system/lib/libc。所以(pthread _ create 240)
围绕个人计算机的代码:
400 ea 854 6a 014478 62021 e4a f 7 fdb 95a e 008 FD 39
400 ea 864 4621482 a 44784 a2a f 001447 a 4a 13 F9 b 3
400 ea 874 49286014 f8d 14479 079 a31 BC f501d 51c
400 ea 884 e8bd 70 e 0 f02c 40 f 8 4823 b 895 f7fd 4478
400个ea 894 4822 fd0d e7fa 4478 42b 7688 f ae10 f 43f
400 ea8a 4 481 Fe 611 e7f 24478 4478481 e 6888 e7ef
400 ea8b 4 f43f 4298 e606 aed 4 BF 00 BD F8死电池
400 ea8c 4 0003 cdae 0003 CDA 0 0003 CD 08 0003283 b
CBF 2 0003 CBD 0
400 ea8e 4 0003 CB 74 0003 CB 5e 0003 caf 8 0003 CAE 0
400 ea8f 4 0003 ace 0003 ca 76 0003 ca 50 0003 c9c 6
400件904 0003件970 0003件956 0003件938 0002件e90c
400件914 0003249d 0003 c 914 00032479 00032471
400个924 00032461 0003245 b 460 db 538 b 1704601
400件934 0200件45件405件405件
400 ea 944 ef24f 028 BF 1842 A8 34 fff 04f 4604 e000
围绕实验室反应堆的代码:
400个850个482个e61a 3个6a 014478 62021个e4a f 7个fdb 95a
400 ea 860 e 008 FD 39 4621482 a 44784 a2a f 001447 a
400 ea 870 4a 13 f9b 3 49286014 f8d 14479 079 a31 BC
400 ea 880 f 501d 51 c e8bd 70 e 0 f02c 40 f 8 4823 b 895
400个890个f7fd 4478 4822 fd0d e7fa 4478 42b 7688 f
400 ea8a 0 ae10 f 43f 481 Fe 611 e7f 24478 4478481 e
400 ea8b 0 6888 e7ef f43f 4298 e606 aed 4 BF 00 BD F8
400ea8c0死区0003cdae 0003cda0 0003cd08
400 ea8d 0 0003283 b 0003 cc7c 0003 cc6a 0003 CBF 2
400 ea8e 0 0003 CBD 0 0003 CB 74 0003 CB 5e 0003 caf 8
400 ea8f 0 0003 CAE 0 0003 CAE 0003 ca 76 0003 ca 50
400 ea 900 0003 c9c 6 0003 c 970 0003 c 956 0003 c 938
400 ea 910 0002 e90c 0003249d 0003 c 914 00032479
400 ea 920 00032471 00032461 0003245 b 460 db 538
400 ea 930 b 1704601 0200 ea 45 f 405 FB 00 04030 c 10
400 ea 940 4620 b143 ef24f 028 BF 1842 A8 34 fff 04f
谷歌的工程师非常老练。围绕pc的代码下面是一个五列矩阵,可读性强。近期项目需要加密算法,调试时打印矩阵是个不错的选择。由于android jni提供的接口
_ _ android _日志_写入
每次打印都会是一行,没有printf方便。所以需要对__android_log_write进行二次封装。想法是先申请一个空间,然后把打印的内容存储在这个内存里,最后注销。
具体代码如下:
#包含android/log.h
#包括cstring
#包含cstdlib
//通常在公共文件中定义
#定义ldebug(标签,格式,){__android_log_write(标签,格式,# # _ _ VA _ ARGS _ _);}
#定义标签“345”
Voidprint _ matrix (char * text,size _ t size){//打印一个16列的矩阵
char temp[16]={ 0 };
size _ t lines=(size 15)/16;//保证要打印的整行的矩阵。
线条=线条0?台词:1;//最小值是1
const size _ t LEN=lines * 16 * 3 1;//为打印buf申请足够的缓冲区。乘以3,因为char字符在打印过程中为每个传入的字符占据三个位置。见注释AB。
char * buf=(char *)malloc(LEN * sizeof(char));
if (NULL==buf) {
返回;
}
memset(buf,0,LEN);
int n=0;
for(size _ t I=0;I行* 16;i ) {
if (16==n) {
strcat(buf,' \ n ');//注意A:一个字符
n=0;
}
if (n 0 i 0) {
strcat(buf,' ');//注意A:一个字符
}
memset(temp,0,16);
If (i size) {//如果在文本字符串中,打印字符串内容;如果超过文本长度,则打印00。
snprintf(温度,16,'x',*(文本一));//注B:两个字符。
}否则{
snprintf(温度,16,'x',0);//注B:两个字符。
}
strcat(buf,temp);
n;
}
*(buf LEN-1)=' \ 0 ';//注意字符串的结尾
ldebug(标签,' %s ',buf);
免费(buf);
buf=NULL
}
测试调用代码
void testPrintMatrix() {
char temp[]='您好,这是print_matrix的测试用例。';
print_matrix(temp,sizeof(temp));
}
输出结果
08-03 18:46:03.101 D/345 (30611):测试打印矩阵
D/345(30611):48 65 6c 6f 2c 20 74 68 69 73 20 69 73 20 70
D/345(30611):72 69 6e 74 5f 6d 61 74 72 69 78 27 73 20 74 65
D/345(30611):737420636173652e 0000000000000
注意,记得在Android.mk中添加,因为你用的是android/log.h
LOCAL _ LDLIBS:=-L $(SYSROOT)/usr/lib-llog
如有任何问题,请留言或与本站社区讨论。感谢阅读,希望能帮到你。感谢您对本站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。