1.       原文链接:NDK单步调试方法

如有问题或者版权要求,请拜访原作者或者通知本人.

最近为了性能需求,开始搞JNI,白手起搞真心不容易。中间差点崩溃了好几次,最终总算得到一点心得。

JNI对性能的提升没有我预想中的大,对于for循环的速度提升大概在1倍左右,所以如果数量级不大的话,性能提升不会很明显

JNI编完之后,不能调试,是不是很蛋疼,不像android Java可以看出错信息。JNI crash之后,界面上表示为没有任何反应,过段时间直接退出应用,没有提示、也没有XXX已停止运行。第一次遇到真是无从下手,有没有!!!,经过对Java层的log研究发现,原来JNI crash后,cpu就直接死在那里(相当于assert,程序停止运行)。果断时间后JAVA层发现程序已挂之后(进程僵死),就强制杀死该进程。于是程序直接退出而无提示。(以上分析纯属个人分析,如有不对,敬请指正)。这时发现如果能有单步调试功能那该多好!!

百度一下 ndk单步调式 一般能搜出如下结果:

1、安装CDT插件

2、安装Sequoyah插件

3、使用插件装入JNI文件、导入JNI头文件

4、配置eclipse JNI编译环境

5、修改ndk-gdb脚本

6、运行ndk-gdb脚本,并修改生成的文件(windows需安装cygwin)

7、配置eclipse native调试环境

吓尿了,有没有!!!单步调试这么麻烦!!!麻烦不说,windows下使用ndk-gdb效率还特别低

另外,对于修改google release的ndk脚本,我一直持保留态度,安说release的脚本应该直接能用的,为什么要做修改后才能用呢?

以上步骤,我花了2~3小时搞定,仅仅为了能打个断点~~~

在机缘巧合下,我看到一篇google官方的文章“Using NDK Plugins”

令人兴奋的是,ADTr20已经支持JNI单步调试,再也不需要如上这么麻烦的步骤了

你现在需要做的只需以下2步:

1、使用ndk-build编译时,加上如下参数NDK_DEBUG=1 V=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件

2、在项目的Debug Configuration中选择Android Native Apllication,点击下方Debug

3、Enjoy your Debugging!

如何?是不是超简单,而且调试速度还相当快哦

ADTr20已经比较完美支持NDK开发了。可以集成ndk编译,只需在项目右键Add Native Support,就能自动生成jni文件,并部署编译环境(注意这个过程是不可逆的,手动删除jni文件后,会编译不过)。如果需要生成NDK调试文件,需要右键项目->properties->C/C++ build->Builder Setting 把默认的Build Command : ndk-build 修改成 ndk-build NDK_DEBUG=1 V=1

最后推荐一个很有用的android官方网站http://tools.android.com/ 这个网站包含大多数ADT使用方法和新版ADT的介绍,获益匪浅

关于如何使用ADT进行ndk单步调式就在http://tools.android.com/recent/usingthendkplugin

只可惜这种方法只能在ndk环境下使用,如果要对framework中的jni进行单步调试,应该就行不通了,推荐的一种方法是把它在NDK中编译调试完毕,然后将生成的so放在system/lib下

文章补充:

若出现 找不到ABI 的问题,测可能是 目标平台没有对齐,统一一下.

参考:http://stackoverflow.com/questions/18245867/getting-unknown-application-abi-when-trying-to-debug-some-c-code-in-my-android

http://stackoverflow.com/questions/20047348/unknown-application-abi-while-debug-as-native-application

It was apparently due to the subliminal message shown between the Unknown Application ABI lines. So I added

APP_PLATFORM := android-10

to my Android.mk, and it works.

2. 在工程右键 属性--C/C++Build-build setting

ndk-build  修改为  ndk-build NDK_DEBUG=1 V=1

实现Android-JNI本地C++调试相关推荐

  1. 一天掌握Android JNI本地编程 快速入门

    一.JNI(Java Native Interface)        1.什么是JNI:               JNI(Java Native Interface):java本地开发接口 JN ...

  2. Android调用JNI本地方法跟踪目标代码

    正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用  ...

  3. uniapp 原生安卓开发插件(module),以及android环境本地调试(一)

    uniapp 原生安卓开发插件(module),以及android环境本地调试 1.开发前景 由于uniapp 框架的局限先,有很多功能不能如原生android开发使用顺畅,因此,需要使用插件进行辅助 ...

  4. android jni 中实现 LOG 输出调试

    android jni 中实现 LOG 输出调试 在jni 文件夹下 android.mk文件中 添加 LOCAL_LDLIBS += -L$(SYSTEM)/usr/lib -llog 在jni中添 ...

  5. Android JNI学习(四)——JNI的常用方法的API

    前三篇主要讲解了jni基础相关的理论知识,今天主要讲解一下JNI的常用方法的API,掌握了基本的理论知识和常用的API接下来才能更好的实战. jni的常用API大纲 再看API前,我建议大家主要结合官 ...

  6. Android JNI(二)——实战JNI入门之Hello World

    上一篇我们讲解了ndk以及jni基础,接下来以实战方式讲解几种常见的jni调用方式,带你走进jni世界. 大纲 今天会详细讲解几种jni的实现方式,实战NDK实现 "hello world& ...

  7. c++ log 打印android_如何在ANDROID JNI 的C++中打Log

    http://blog.csdn.net/pkigavin/article/details/8583537 最近在研究Android 2.3.3源代码的C/C++层,需要对代码进行一些调试,但是奇怪的 ...

  8. android jni 调用 java_Android与JNI(二) ---- Java调用C++ 动态调用

    目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI( ...

  9. Android JNI原理分析

    引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: frameworks ...

  10. Android JNI 和 NDK

    1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

最新文章

  1. C++指针与引用的区别
  2. CUDA+OpenCV实现光线追踪(有无constant)
  3. 6、UmbracoNewsSite:添加新闻分类
  4. ibatis主键自动生成
  5. linux优先级队列,Python3 线程优先级队列( Queue)
  6. 编写一个函数,该函数能判断一个英文句子str(带空格)中是否含有某个单词w,如“How old are you?”含有“old”。在main函数中输入一个英文句子,再输入一个单词,如果英文句子中含有那
  7. Cannot resolve jakarta.validation:jakarta.validation-api:2.0.2
  8. 人缘还挺好!史玉柱:被人网上恶搞 马云等十几人打电话来慰问我
  9. Kubernetes学习总结(14)—— Kubernetes 实用命令总结
  10. (1)Java 教程
  11. Spring声明式事物DataSourceTransactionManager的使用与jdbcTemplate的使用
  12. freeradius部署及挑战模式配置
  13. 半路出家,如何推销自己?
  14. 微信圣诞头像来了,快给你的头像带上圣诞帽吧
  15. mysql 月初 月末_月初 月末 sql 语句(日期所在月的第一天,最后一天)
  16. ArcMAP 添加注记与编辑
  17. 激光雷达相关技术方案介绍
  18. Linux磁盘与文件系统管理
  19. Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收
  20. 1.豆豆项目搭建之springboot集成mybatis-plus(包含mybatis-plus自动生成基础代码)

热门文章

  1. “数据中国”路在何方?答:在“数据中国加速计划”
  2. Angularjs 如何在 post 请求时去掉因 ng-repeat 产生的 $$hashkey?
  3. struts2原理分析之反射技术动态获取属性
  4. [转]C#与数据结构--树论--平衡二叉树(AVL Tree)
  5. 现在为什么面对着人多,陌生人的时候会紧张?
  6. JAVA中byte为负数处理
  7. ConfigParser 模块
  8. 217. Contains Duplicate
  9. 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
  10. Javascript闭包概念剖析