如何定位android ndk开发中遇到的错误

 我来答
厦门侯
高粉答主

2016-01-21 · 信息管理员
厦门侯
采纳数:30618 获赞数:90294

向TA提问 私信TA
展开全部
 NDK错误发生时,我们能拿到什么信息?

  利用Android
NDK开发本地应用的时候,几乎所有的程序员都遇到过程序崩溃的问题,但它的崩溃会在logcat中打印一堆看起来类似天书的堆栈信息,让人举足无措。单靠添加一行行的打印信息来定位错误代码做在的行数,无疑是一件令人崩溃的事情。在网上搜索“Android
NDK崩溃”,可以搜索到很多文章来介绍如何通过Android提供的工具来查找和定位NDK的错误,但大都晦涩难懂。下面以一个实际的例子来说明,首先生成一个错误,然后演示如何通过两种不同的方法,来定位错误的函数名和代码行。

  首先,看我们在hello-jni程序的代码中做了什么(有关如何创建或导入工程,此处略),看下图:在JNI_OnLoad()的函数中,即so加载时,调用willCrash()函数,而在willCrash()函数中, std::string的这种赋值方法会产生一个空指针错误。这样,在hello-jni程序加载时就会闪退。我们记一下这两个行数:在61行调用了willCrash()函数;在69行发生了崩溃。

  下面来看看发生崩溃(闪退)时系统打印的logcat日志:

  [plain] view
plain copy

  *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

  Build fingerprint: 'vivo/bbk89_cmcc_jb2/bbk89_cmcc_jb2:4.2.1/JOP40D/1372668680:user/test-keys'

  pid: 32607, tid: 32607, name: xample.hellojni >>> com.example.hellojni <<<

  signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

  r0 00000000 r1 beb123a8 r2 80808080 r3 00000000

  r4 5d635f68 r5 5cdc3198 r6 41efcb18 r7 5d62df44

  r8 4121b0c0 r9 00000001 sl 00000000 fp beb1238c

  ip 5d635f7c sp beb12380 lr 5d62ddec pc 400e7438 cpsr 60000010

  

  backtrace:

  #00 pc 00023438 /system/lib/libc.so

  #01 pc 00004de8 /data/app-lib/com.example.hellojni-2/libhello-jni.so

  #02 pc 000056c8 /data/app-lib/com.example.hellojni-2/libhello-jni.so

  #03 pc 00004fb4 /data/app-lib/com.example.hellojni-2/libhello-jni.so

  #04 pc 00004f58 /data/app-lib/com.example.hellojni-2/libhello-jni.so

  #05 pc 000505b9 /system/lib/libdvm.so

  #06 pc 00068005 /system/lib/libdvm.so

  #07 pc 000278a0 /system/lib/libdvm.so

  #08 pc 0002b7fc /system/lib/libdvm.so

  #09 pc 00060fe1 /system/lib/libdvm.so

  #10 pc 0006100b /system/lib/libdvm.so

  #11 pc 0006c6eb /system/lib/libdvm.so

  #12 pc 00067a1f /system/lib/libdvm.so

  #13 pc 000278a0 /system/lib/libdvm.so

  #14 pc 0002b7fc /system/lib/libdvm.so

  #15 pc 00061307 /system/lib/libdvm.so

  #16 pc 0006912d /system/lib/libdvm.so

  #17 pc 000278a0 /system/lib/libdvm.so

  #18 pc 0002b7fc /system/lib/libdvm.so

  #19 pc 00060fe1 /system/lib/libdvm.so

  #20 pc 00049ff9 /system/lib/libdvm.so

  #21 pc 0004d419 /system/lib/libandroid_runtime.so

  #22 pc 0004e1bd /system/lib/libandroid_runtime.so

  #23 pc 00001d37 /system/bin/app_process

  #24 pc 0001bd98 /system/lib/libc.so

  #25 pc 00001904 /system/bin/app_process

  

  stack:

  beb12340 012153f8

  beb12344 00054290

  beb12348 00000035

  beb1234c beb123c0 [stack]

  

  ……

  如果看过logcat打印的NDK错误时的日志就会知道,省略了后面很多的内容,很多人看到这么多密密麻麻的日志就已经头晕脑胀了,即使是很多资深的Android开发者,在面对NDK日志时也大都默默的选择了无视。
可以叫我表哥
2014-12-22 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
采纳数:25897 获赞数:1464973
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。

向TA提问 私信TA
展开全部
  Android NDK是什么,为什么我们要用NDK?

  Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。NDK包括了:
  从C / C++生成原生代码库所需要的工具和build files。
  将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files,即.apk文件)中。
  支持所有未来Android平台的一些列原生系统头文件和库
  为何要用到NDK?概括来说主要分为以下几种情况:
  代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
  在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
  便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

  Android JNI是什么?和NDK是什么关系?

  Java Native Interface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++和汇编语言)编写的应用程序和库进行交互操作。
  简单来说,可以认为NDK就是能够方便快捷开发.so文件的工具。JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式