java jni 类调用_jni调用java类的属性和方法(一)

正文

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.方法签名:如下表

e28d348331dd

方法签名

如. 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.获取属性idjfieldID (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,"","()V");//然后调用该类的构造方法

obj = (*env)->NewObject(env, jc, mid);//最后生成一个新的对象

参数解析:

jc :是需要创建的Java对象的Class对象

methodID:是传递一个方法ID,构造函数的方法ID。创建一个类是先执行其构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值