前言:
上一篇博客我们讲到了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的方法的
静态调用方式


- 通过上面的代码我们可能发现了在参数里面出现了 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) | |
- 上面的表格中就是一些基本的参数,大家可以参看练习,举一反三
已经就是jni使用的一些基本函数, 上面代码的demo我会同步到github
Android技术交流:973579144