本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!
前言:
上一篇博客我们讲到了Android studio 开发jni的基本配置,这一篇博客我们主要讲java和c++之间通过jni是如何交互的.
- 我们先创建两个方法,一个是java调用c++,一个是c++调用java的方法
- java调用的c++方法需要使用"native"进行修饰,表示是一个本地方法,不需要进行实现.
- 我们要c++中创建一个与java一样的方法
根据上图的标记的顺序进行讲解:
1.include 可以理解成java中的import
2."JNIEXPORT" 同java中的jni方法要被native修饰一样
3.方法名就是对应java中包名_类名_方法名
4.JNIEnv:JNIEnv 可以说是整个 JNI 的核心类,是 Java 和 C 通讯的桥梁,它可以协助我们将
JNI 类型转换成 C 类型,不仅如此,调用 Java 对象的方法,获取或者修改属性,都是由 JNIEnv 来做。
-
jstring就是java中传来的一个参数,在java里面是String,在这里是jstring
-
这是一张java-jni数据数据类型对应表
-
-
接下来我们看看是如何调用java的方法的
静态调用方式
非静态方法
调用java的静态字段
- 通过上面的代码我们可能发现了在参数里面出现了 jclass 和 jobject 两个不同类型的参数,它是起到什么作用jclass:可以看java中的class,jobject:可以看做java中的this
- 获取java中有参数的方法 如:env->GetMethodID(class,"",sig)对于最后一个参数代表的java中的参数类型,这时候会产生一个 疑问,如何填写这样的参数,
boolean:Z、byte:B、char:C、short:S、int:I、long:J、float:F、double:D、void:V、[数组]:[和类型``Object对象:L包名/类名; 或 包名/类名$标识嵌套类;例子(方法 ->- 对应的sig):
| Java方法 | 对应的sig |
|---|---|
void M1(int A,int B) | "(II)V" |
void M2(String S) | "(Ljava/lang/String;)V" |
void M3(int[] I) | "([I)V" |
String M4(String S,int index) | ``` |
| "(Ljava/lang/String;I)V" |
- 上面的表格中就是一些基本的参数,大家可以参看练习,举一反三
已经就是jni使用的一些基本函数, 上面代码的demo我会同步到github
Android技术交流:973579144
[我的github开源项目](https://github.com/BeaHugs/RxImagePicker)