正文
1.访问类方法
1.1 获取类
jni中c/c++想要调用java中的类,就必须先找到这个类,在java中,获取一个类是通过一个类的全限定名,即包名加类名。同样的,而在jni当中,获取类的方法有两种:
1.通过类的全限定名来过去,比如获取java中的String类
jclass jc=(*env)->FindClass(env,"Ljava/lang/String;");
2.通过传入的对象,直接获取该类
jclass jc=(*env)->GetObjectClass(env,obj);
1.2获取方法
java中,方法有两种,一是静态方法,一是实力方法,在jni中获取类的定义同样有两种
jmethodID (JNICALL *GetMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
jmethodID (JNICALL *GetStaticMethodID)(JNIEnv *env, jclass class, const char *name, const char *sig);
使用jni.h中提供的GetMethodID方法, 获取jmethodID, 传入参数 ①JNIEnv指针 ②Class对象 ③ 方法名 ④方法签名, 在这里方法名和方法签名确定一个方法, 方法签名就是方法的返回值 与 参数的唯一标示;
参数解析:
1.JNIEnv指针指的是env
2.Class对象:就是1获取类中的jc
3.方法名:所要调用的方法的名称 ,如 java中 setName(String name);中的"setName";
4.方法签名:如下表
如. long function(int n, String str, int[] arr);
该方法的签名:(ILjava/lang/String;[I)J 前面的()代表方法的参数类型,依次排列,括号后面的J代表返回类型long
1.3 调用方法
在1.2中,我们可以获取到methodID,获得方法id后就可以调用该方法了
需要调用相应返回类型的方法 格式是CallTypeMethod
如 long function(int n, String str, int[] arr);
返回类型是long 对应的方法是 CallLongMethod
以此类推
如果是静态方法,则是 CallStaticTypeMethod 只需要在普通方法的类型前加一个Static标记
如 CallStaticIntMethod
参数介绍 : ① JNIEnv指针 ②调用该native方法的对象 ③方法的methodID ④⑤... 后面是可变参数
1.JNIEnv指针指的是env
2.调用该native方法的对象:就是1中的obj
3.方法的methodID:1.2中获取的方法id
4.参数:方法中需要传入的参数
1.4 访问类的属性
1.获取属性id
jfieldID (JNICALL *GetFieldID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
jfieldID (JNICALL *GetStaticFieldID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
参数介绍:
1.JNIEnv指针指的是env
2.Class对象:就是1获取类中的jc
3.属性名:类的属性的名称
4.方法签名:参考图方法签名
2 创建类
常用的JNI中创建对象的方法如下
jobject NewObject(jclass jc, jmethodID methodID, ...)
如果java类有多个构造方法,则需要调用构造方法来创建一个对象,流程如下
jclass jc= (*env)->FindClass(env, "java/lang/String"); //使用类的权限定名找到该类的定义
jmethodID mid = (*env)->GetMethodID(env, jc,"<init>","()V");//然后调用该类的构造方法
obj = (*env)->NewObject(env, jc, mid);//最后生成一个新的对象
参数解析:
jc :是需要创建的Java对象的Class对象
methodID:是传递一个方法ID,构造函数的方法ID。创建一个类是先执行其构造方法