在android下面使用jni来调用c++,在开发游戏是非常正常的。但是要调试c++部分却是非常麻烦的问题。如果快速定位崩溃位置呢。NDK提供了一个小工具ndk-stack.
首先,我们先配置环境,把NDK路径和adb的路径配置到环境变量中。如下面:
ADBPATH = F:\DevelopTools\adt-bundle-windows-x86_64-20131030\sdk\platform-tools
NDKROOT = F:\DevelopTools\android-ndk-r9d
Path = %path%;%NDKROOT %;%ADBPATH%;
接下, 去我们到工程的根目录,执行以下命令:
adb logcat | ndk-stack -sym obj/local/armeabi
开始执行调试游戏,出现下列错误
********** Crash dump: ********** Build fingerprint: ‘generic/sdk/generic:2.3.3/GRI34/101070:eng/test-keys‘ pid: 571, tid: 571 >>> com.example.hellojni <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 Stack frame I/DEBUG ( 30): #00 pc 00000eb0 /data/data/com.examp ringFromJNI at C:\Users\zhangchuanwei\workspace1\hellojni/jni/hellojni.cpp:22 Stack frame I/DEBUG ( 30): #01 pc 00017d74 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #02 pc 00048f08 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #03 pc 00041ab6 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #04 pc 0002976c /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #05 pc 00021020 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #06 pc 0005f5de /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #07 pc 00066fce /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #08 pc 0001cfd4 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #09 pc 000220dc /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #10 pc 00020fd0 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #11 pc 0005f430 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #12 pc 0004b9a8 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #13 pc 0003ebb0 /system/lib/libdvm.s Stack frame I/DEBUG ( 30): #14 pc 000314ac /system/lib/libandro Stack frame I/DEBUG ( 30): #15 pc 000322c6 /system/lib/libandro Stack frame I/DEBUG ( 30): #16 pc 00008ca2 /system/bin/app_proc Stack frame I/DEBUG ( 30): #17 pc 00014db8 /system/lib/libc.so
直接可以看到我们的工程第22行有错误,看下22行是什么
18 struct strTest{ 19 char* pstr; 20 }; 21 strTest *ptest=NULL; 22 ptest->pstr=NULL; 23 return env->NewStringUTF("hello world returned.");
对于ndk-stack的使用可以看ndk根目录下的docs/NDK-STACK.html文件
源码:http://files.cnblogs.com/chuanwei-zhang/hellojni-dynamic.zip
static const char* className = "com/example/hellojni/MainActivity"; JNIEXPORT jstring JNICALL stringFromJNI(JNIEnv* env, jclass clazz) { //return env->NewStringUTF(env, "Hello form JNI!"); struct strTest{ char* pstr; }; strTest *ptest=NULL; ptest->pstr=NULL; return env->NewStringUTF("hello world returned."); }
下载源码,并替换hellojni.cpp里面的上面这个函数,就可以重现上面问题了。