Android深入系统完全讲解(41)
Posted 程序员入门进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android深入系统完全讲解(41)相关的知识,希望对你有一定的参考价值。
我们要学习的是整体逻辑,我们 C 找 Java 的依据是类和对象,参数中 JNIEnv *env, jobject
obj 。 env 代表当前环境上下文,这个当我们多个线程调用的时候,需要
AttachCurrentThread 进行设定,让 env 关联到当前线程,使用后 DetachCurrentThread 解
除绑定。 默认不需要关注,多线程时候,出现调用故障,可以往这个方向思考。
多线程开发,核心是并发下的数据同步。所以我们写代码,就要注意方法的可重用性,也就
是尽量不使用全局变量,如果用,有多个线程竞争的时候,就会出问题。
要解决这个全局变量的问题,就会使用到多线程开发中的同步机制。
相关知识,参考《深入理解操作系统》第三版。快速学习,可以阅读如下网
站:https://github.com/CyC2018/CS-Notes#computer-%E6%93%8D%E4%BD%9C%E7%B3%BB%E
7%BB%9F
17. 参考文档
官方 r8 里面的 docs
官方 r8 里面的 samples,作为学习参考代码
https://developer.android.google.cn/ndk/guides/
https://github.com/googlesamples/android-ndk/tree/master
学习 NDK 这些就足够了,如果你需要继续进阶,课程最后的延伸内容,希望能帮助到你。 异常分析思路
18.1 native-lib.c 写个异常
Java_hellojni_codegg_com_hellojni_MainActivity_myResultFromJNI 方法后面加入如下一段代
码:int *p=NULL;
*p=0; 我们丢个空指针,让应用运行异常,然后打开 Logcat,选中 Error 类别,可以看到如下一
段错误:
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 2346 (gg.com.hellojni), pid 2346 (gg.com.hellojni)
异常类型 SEGV_MAPERR ,异常地址为 0,在线程 2346 ,报名为 gg.com.hellojni ,进程
为 2346 里面。
Build fingerprint: ‘Android/vbox86p/vbox86p:9/PD1A.180720.031/22:userdebug/test-keys’ 初步
定位版本信息,可以确定下版本是否正确。
ABI: ‘x86’ 这里可以看到我们配置的 ABI 是 x86 。(我们项目使用的是 armeabi-v7a ,这
里我在模拟器演示,模拟器用了 x86 ,于是修改了 build.gradle 中的 abiFilters “armeabi-v7a” 为 abiFilters “x86”) Cause: null pointer dereference 报出了错误信息,空指针引用 eax
00000000 这个指示第一个参数为空,一般是我们引用的直接指针,跟上面的提示一致了。
backtrace: 这个下面是关键,通过这个堆栈信息,去找对应的代码位置。 #00 pc
000007cc /data/app/hellojni.codegg.com.hellojni-dTY8-szLK_JlHlNRLDpEZw==/lib/x86/libnative-li
b.so (Java_hellojni_codegg_com_hellojni_MainActivity_myResultFromJNI+396 ) 这里指出了是
在 Java_hellojni_codegg_com_hellojni_MainActivity_myResultFromJNI 的汇编指令的偏移 396
行。
我们使用的调试 so 库。如果是 Release 版本,只有红色的部分信息。于是我们就要想办法,
通过红色部分的信息,找到代码位置在哪。
以上是关于Android深入系统完全讲解(41)的主要内容,如果未能解决你的问题,请参考以下文章