,,Android jni调试打印char阵列的实例详解

,,Android jni调试打印char阵列的实例详解

这篇文章主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: