JAVA语言JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释
Vivian 2018-06-26 来源 : 阅读 835 评论 0

摘要:本文主要向大家介绍了JAVA语言中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释,希望对大家学习JAVA语言有所帮助。

上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用

首先来看一下C++中的sayHello方法的实现:

[cpp] view plain copy
1. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)  
2. {  
3. cout<<"Hello World"<<endl;  
4. }

对于这个方法参数中的JNIEnv* env参数的解释:

JNIEnv类型实际上代表了Java环境,通过这个JNIEnv* 指针,就可以对Java端的代码进行操作。例如,创建Jaa类中俄对象,调用Java对象的方法,获取Java对象中的属性等等。JNIEnv的指针会被JNI传入到本地方法的实现函数中来对Java端的代码进行操作。

JNIEnv类中有很多函数可以用:

NewObject:创建Java类中的对象

NewString:创建Java类中的String对象

New<Type>Array:创建类型为Type的数组对象

Get<Type>Field:获取类型为Type的字段

Set<Type>Field:设置类型为Type的字段的值

GetStatic<Type>Field:获取类型为Type的static的字段

SetStatic<Type>Field:设置类型为Type的static的字段的值

Call<Type>Method:调用返回类型为Type的方法

CallStatic<Type>Method:调用返回值类型为Type的static方法

等许多的函数,具体的可以查看jni.h文件中的函数名称。

 

参数:jobject obj的解释:

如果native方法不是static的话,这个obj就代表这个native方法的类实例

如果native方法是static的话,这个obj就代表这个native方法的类的class对象实例(static方法不需要类实例的,所以就代表这个类的class对象)

 

下面来看一下Java和C++中的基本类型的映射关系:

 JAVA语言JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

具体的说明可以查看jni.h文件。

 

为了能够在C/C++中使用Java类,jni.h头文件中专门定义了jclass类型来表示Java中的Class类

JNIEnv类中有如下几个简单的函数可以取得jclass:

jclass FindClass(const char* clsName):通过类的名称(类的全名,这时候包名不是用.号,而是用/来区分的)来获取jclass

如: jclass str = env->FindClass("java/lang/String");获取Java中的String对象的class对象。

jclass GetObjectClass(jobject obj):通过对象实例来获取jclass,相当于java中的getClass方法

jclass GetSuperClass(jclass obj):通过jclass可以获取其父类的jclass对象

 

在C/C++本地代码中访问Java端的代码,一个常见的应用就是获取类的属性和调用类的方法,为了在C/C++中表示属性和方法,JNI在jni.h头文件中定义了jfieldId,jmethodID类型来分别代表Java端的属性和方法

我们在访问,或者设置Java属性的时候,首先就要先在本地代码取得代表该Java属性的jfieldID,然后才能在本地代码中进行Java属性操作,同样的,我们需要呼叫Java端的方法时,也是需要取得代表该方法的jmethodID才能进行Java方法调用

 

使用JNIEnv的:

GetFieldID/GetMethodID

GetStaticFieldID/GetStaticMethodID

来取得相应的jfieldID和jmethodID

下面来具体看一下这几个方法:

GetFieldID(jclass clazz,const char* name,const char* sign)

方法的参数说明:

clazz:这个简单就是这个方法依赖的类对象的class对象

name:这个是这个字段的名称

sign:这个是这个字段的签名(我们知道每个变量,每个方法都是有签名的)

怎么查看类中的字段和方法的签名:

使用javap命令:

 JAVA语言JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

GetMethodID也能够取得构造函数的jmethodID,创建一个Java对象时可以调用指定的构造方法,这个将在后面向大家介绍:

如:env->GetMethodID(data_Class,"<init>","()V");

下面看一下签名的格式:

 JAVA语言JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

下面来看一下例子:

这里没有上代码了:真正演示的时候等下一篇内容,这一篇只是说一下方法的使用:

 JAVA语言JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

 JAVA语言JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

以上就是职坐标整理发布关于JAVA的介绍,先祝大家对它有了一定的了解吧,了解更多内容,请关注职坐标编程语言JAVA频道!


本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程