Android NDK, Revision 8d (December 2012)
前一篇,简单介绍了使用NDK进行JNI的编程实践,当时使用的NDK版本是1.6_r1(2009),是很早的版本了,相应的toolset也就只包含了少数简单的命令。
JNI编程,必然涉及到C编程,那么当Application在C函数中遇到了错误,甚至crash(如Segmentation fault,’Process xxx terminated by signal (11)’)时,就需要调试。可是在logcat中的信息就跟’天书’一样,只能找到一些寄存器以及函数地址。那要如何进行调试呢?
从NDK r5b开始,增加了调试的支持,引入了ndk-gdb(可以单步调试程序)和ndk-stack(可以查看堆栈信息)脚本。那么下面我们就来说说如何使用 Android NDK, Revision 8d。
一、下载Android NDK, Revision 8d,解压即可。(如E:\android-ndk-r8d)
二、Cygwin配置
用ultraEdit打开Cygwin/home/user/.bash_profile,在文件最后加入如下内容:
export ndk8=/cygwin/e/ android-ndk-r8d
在Cygwin终端输入如下命令:
source /home/user/.bash_profile
或者重启Cygwin终端。
如果cd $ndk8能进入/cygwin/e/ android-ndk-r8d,那么配置成功。
三、编译.so
在Cygwin终端进入Andorid工程根目录如../MyJni/project/后,直接输入:ndk-build
就可以编译安装.so文件最后会在project/下新增两个文件夹:
libs/armeabi/
obj/
以上过程基本和使用NDK1.6_r1一样。下面主要介绍ndk-adb使用方法。
1、 重新编译,并且加入NDK_DEBUG=1选项,即:ndk-build NDK_DEBUG=1
2、 运行ndk-adb
3、 设置断点,
(gdb) b 10
Breakpoint 1 at 0x80901244: file jni/MyJni.c, line 10.
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0xafd1cb6a in strcat () from E:\eclipse\MyJni\project/./obj/local/armeabi/libc.so
很明显上面的程序出现了Segmentation fault。具体错在0xafd1cb6a in strcat ()函数。
而在logcat中你只能看到如下信息:
01-21 08:36:12.487: I/DEBUG(30): *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-21 08:36:12.487: I/DEBUG(30): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
01-21 08:36:12.487: I/DEBUG(30): pid: 308, tid: 308 >>> com.jni.testjni <<<
01-21 08:36:12.495: I/DEBUG(30): signal 11 (SIGSEGV), fault addr 00000000
01-21 08:36:12.495: I/DEBUG(30): r0 beebf43c r1 00000000 r2 beebf480 r3 00000000
01-21 08:36:12.495: I/DEBUG(30): r4 afd489b0 r5 00000000 r6 00000000 r7 beebf430
01-21 08:36:12.565: I/DEBUG(30): #00 pc 0001cb6a /system/lib/libc.so
01-21 08:36:12.565: I/DEBUG(30): #01 lr 8090158b /data/data/com.jni.testjni/lib/libHelloJni.so
……….
和logcat对比,显然gdb的内容对开发人员更有帮助。
相关推荐
Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例
本Demo用于android调用jni初学者,以供参考,demo中只是实现了Android调用jni通信机制,为入门者更通俗易懂。
Android使用JNI调用Python so解释器
教你如何生成.h文件,使用window通过NDK编译出.so文件,如何通过JNI调用so文件
android通过JNI访问硬件LED,包含应用程序APP,JNI代码,和LED驱动程序。
Android调用Jni返回自定义对象 博客:http://blog.csdn.net/lowprofile_coding/article/details/39367323
Android串口JNI代码,亲自验证,可以进行数据收发。
webrtc-android-jni
android通过JNI控制LED http://blog.csdn.net/newairzhang/article/details/38469271
Android中实现JNI的AES加解密源代码,绝对可以运行!
Android studio JNI函数以及复杂对象传递
Android Studio两个工程中:一个使用jni可以编译成so,一个app中加载so,调用jni的接口
android jni资料分享,初学者学习之
在jni中获取android 设备的mac地址
android jni 实现 RSA 3DES AES MD5 BASE64 加密,基于openssl
JNI和NDK的关系:在Android开发环境中,JNI是实现的目的,NDK是实现JNI的手段,即通过NDK实现JNI功能
android 环境下搭建JNI开发环境,以及Android.mk以及Application.mk相关配置文件,以及方法说明。
android中jni的简单使用示例代码
此文记录一下Android Studio 进行jni开发的基础配置以及入门教程。
Android 通过JNI调用驱动代码实例