首页>

如何解决android NDK开发中的NDK

时间:2020-11-29 16:11:17 /人气:532 ℃
如何解决android NDK开发中的NDK
1,首先,来看看在hello-jni程序的代码2113中5261做了什么(有关如何创建或导入工程,此处略4102),下面代码中:1653在JNI_OnLoad()的函数中,即so加载时,调用willCrash()函数,而在willCrash()函数中,std::string的这种赋值方法会产生一个空指针错误。这样,在hello-jni程序加载时就会闪退。记一下这两个行数:在61行调用了willCrash()函数;在69行发生了崩溃2看看发生崩溃(闪退)时系统打印的logcat日志:、只要细心的查看,再配合Google提供的工具,完全可以快速地准确定位出错的代码位置,这个工作我们称之为“符号化”。需要注意的是,如果要对NDK错误进行符号化的工作,需要保留编译过程中产生的包含符号表的so文件,这些文件一般保存在$PROJECT_PATH/obj/local/目录下。3方法:ndk-stack这个命令行工具包含在NDK工具的安装目录,和ndk-build及其他常用的一些NDK命令放在一起,比如在我的电脑上,其位置是/android-ndk-r9d/ndk-stack。根据Google官方文档,NDK从r6版本开始提供ndk-stack命令,如果你用的之前的版本,建议还是尽快升级至最新的版本。使用ndk–stack命令也有两种方式实时分析日志在运行程序的同时,使用adb获取logcat日志,并通过管道符输出给ndk-stack,同时需要指定包含符号表的so文件位置;如果你的程序包含了多种CPU架构,在这里需求根据错误发生时的手机CPU类型,选择不同的CPU架构目录,如:当崩溃发生时,会得到如下的信息:重点看一下#03和#04,这两行都是在我们自己生成的libhello-jni.so中的报错信息,因此会发现如下关键信息:回想一下之前代码,在JNI_OnLoad()函数中(第61行),调用了willCrash()函数;在willCrash()函数中(第69行),制造了一个错误。4先获取日志再分析这种方法其实和上面的方法没有什么大的区别,仅仅是logcat日志获取的方式不同。可以在程序运行的过程中将logcat日志保存到一个文件,甚至可以在崩溃发生时,快速的将logcat日志保存起来,然后再进行分析,比上面的方法稍微灵活一点,而且日志可以留待以后继续分析。本回答由提问者推荐


月博怡宝老虎机_网上真人手机版_青桐问题分享平台|网站地图