Android深入系统完全讲解(40)

Posted 程序员入门进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android深入系统完全讲解(40)相关的知识,希望对你有一定的参考价值。

  1. 调试 C 代码
    15.1 改成 C 写法
    这个没啥必要,但是对 C 比 C++ 情谊深的我,把它修改了。下面是修改的一部分代码,
    把 C++ 的写法,改成 C 的,同时修改引入头文件。
    jstring
    Java_hellojni_codegg_com_hellojni_MainActivity_stringFromJNI(JNIEnv *env,
    jobject thiz)
    char *hello = “Hello from C++”;
    return (*env)->NewStringUTF(env, hello);

    15.2 配置调试参数
    点击菜单栏上面的 Run | Run/Debug Configurations ,选择 Debugger 菜单的 Debug type 为
    Dual。


设置成可以同时调试 Java 和 C 的代码。
15.3 调试
在 C 代码中 Java_hellojni_codegg_com_hellojni_MainActivity_myStringFromJNI 设置断
点.Debug 运行 App ,可以看到断在了我们设置的断点位置生效了。


剩下的就是单步调试,查看变量,查看堆栈信息了。
16. C 调用 Java
经过十来节的学习,我们走过了 NDK 、 CMake 配置,编译 so 、 ELF(可执行文件),
学会使用 android Studio 调试 C 源码。同时我们在学习实战的过程中,也了解了 JNI 的实
现原理,编译中参数如何配置,怎么查找。并且如果你想去看编译过程,给出了目录。
我们已经学会了 Java 调用 C 的方式,下一步我们就学习如何从 C 调用到 Java 。
我们这一节演示一个内容,如何在 C 代码中调用 Java 的方法,以及属性值。我们实现一
个,在 C 里面,找到 Java 中的两个变量,然后再调用 Java 的一个方法,让返回两数的相
加结果,传回给 Java ,显示出来。
16.1 MainActivity.java 新增一些代码
//两个变量,等会 C 中会读取这两个值
int i = 5;
int n = 10;//返回相加结果,等会 C 会调用这个方法
public int add(int num1, int num2)
return num1 + num2;

//从 C 端获取结果
public native int myResultFromJNI(); 然后选中我们的 myResultFromJNI 方法,点击右键,选择生成.h by javah
16.2 native-lib.c 实现方法:
JNIEXPORT jint JNICALL
Java_hellojni_codegg_com_hellojni_MainActivity_myResultFromJNI
(JNIEnv *env, jobject obj)
//获致 obj 中对象的 class
jclass clazz = (*env)->GetObjectClass(env, obj);
// 获取 java 中 i 字段的 ID(最后一个参数是 i 的签名)
jfieldID id_num1 = (*env)->GetFieldID(env, clazz, “i”, “I”);
// 获取 num1 字段对应的值
jint num1 = (*env)->GetIntField(env, obj, id_num1);
jfieldID id_num2 = (*env)->GetFieldID(env, clazz, “n”, “I”);
// 获取 num2 字段对应的值
jint num2 = (*env)->GetIntField(env, obj, id_num2);
//拿到 add 方法的 id,后面的为签名信息,括号内代表两个参数,都是 I (int)返回也为 I(int)的方

jmethodID methodId = (*env)->GetMethodID(env, clazz, “add”, “(II)I”);
// 调用它,拿到结果jint res = (*env)->CallIntMethod(env, obj, methodId, num1, num2);
return res;

关于参数签名,该如何编写,这里不展开讲解,提供一篇链
接 https://www.jianshu.com/p/c85462c3a26e

以上是关于Android深入系统完全讲解(40)的主要内容,如果未能解决你的问题,请参考以下文章

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(31)

Android 深入系统完全讲解(31)

Android深入系统完全讲解(38)

Android深入系统完全讲解(38)