Android进阶JNI开发(二)

前言:

上一篇博客我们讲到了Android  studio 开发jni的基本配置,这一篇博客我们主要讲java和c++之间通过jni是如何交互的.

Android进阶JNI开发(二)_第1张图片

  • 我们先创建两个方法,一个是java调用c++,一个是c++调用java的方法
  • java调用的c++方法需要使用"native"进行修饰,表示是一个本地方法,不需要进行实现.

Android进阶JNI开发(二)_第2张图片

  • 我们要c++中创建一个与java一样的方法

Android进阶JNI开发(二)_第3张图片

根据上图的标记的顺序进行讲解:

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数据数据类型对应表
  • Android进阶JNI开发(二)_第4张图片

  • 接下来我们看看是如何调用java的方法的
    Android进阶JNI开发(二)_第5张图片 静态调用方式
  •  
Android进阶JNI开发(二)_第6张图片 非静态方法
Android进阶JNI开发(二)_第7张图片 调用java的静态字段
  • 通过上面的代码我们可能发现了在参数里面出现了 jclass 和 jobject 两个不同类型的参数,它是起到什么作用jclass:可以看java中的class,jobject:可以看做java中的this
  • 获取java中有参数的方法  如:env->GetMethodID(class,"",sig)对于最后一个参数代表的java中的参数类型,这时候会产生一个 疑问,如何填写这样的参数,
  • boolean:Zbyte:Bchar:Cshort:Sint:Ilong:Jfloat:Fdouble:Dvoid: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开源项目

 

 

你可能感兴趣的:(组件,java,android,jni)