JNIEnv类型和jobject类型的解释
2016-06-20 18:38
483 查看
转自:http://blog.csdn.net/jiangwei0910410003/article/details/17465457
上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用
首先来看一下C++中的sayHello方法的实现:
[cpp] view plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)
{
cout<<"Hello World"<<endl;
}
对于这个方法参数中的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++中的基本类型的映射关系:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201408/4e27ac3cc068b3ee5d5c308bb9315d9e)
具体的说明可以查看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命令:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201408/f3e21ec7b356d0c37789f3507165033e)
GetMethodID也能够取得构造函数的jmethodID,创建一个Java对象时可以调用指定的构造方法,这个将在后面向大家介绍:
如:env->GetMethodID(data_Class,"<init>","()V");
下面看一下签名的格式:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201408/b23846c5c5c7eb583228d8ab8ba27841)
下面来看一下例子:
这里没有上代码了:真正演示的时候等下一篇内容,这一篇只是说一下方法的使用:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201408/77dbfb4ff30815fa1bc67d103e80351d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201408/4dedb9649f7156fced5ad336ab62b257)
下一篇我们将来说一下这些方法到底是怎么用的。
上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用
首先来看一下C++中的sayHello方法的实现:
[cpp] view plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)
{
cout<<"Hello World"<<endl;
}
对于这个方法参数中的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++中的基本类型的映射关系:
具体的说明可以查看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命令:
GetMethodID也能够取得构造函数的jmethodID,创建一个Java对象时可以调用指定的构造方法,这个将在后面向大家介绍:
如:env->GetMethodID(data_Class,"<init>","()V");
下面看一下签名的格式:
下面来看一下例子:
这里没有上代码了:真正演示的时候等下一篇内容,这一篇只是说一下方法的使用:
下一篇我们将来说一下这些方法到底是怎么用的。
相关文章推荐
- caffe遇到 ImportError: libcudart.so.7.5: cannot open shared object file: No such file or directory
- 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置
- WPF中的binding(八)- 使用ObjectDataProvider对象作为Binding的Source
- 第一篇 Object-C快速入门
- Objective-C实现一个基于数组下标[index]和字典[@"key"]的访问模式
- OpenGL Frame BufferObject(FBO)
- System.Types.hpp(77): E2029 'TObject' must be a previously defined class or struct
- 在ObjectARX的类定义中使用__declspec(dllimport)的危险
- 【Objective-C】02-Objective-C学习及iOS开发的准备
- Android Object
- iOS中使用JSPatch框架使Objective-C与JavaScript代码交互
- iOS复杂动画之抽丝剥茧(Objective-C & Swift)
- QT实现appendSheet(QAxObject的一种Add + Move的方法)
- 预编译加速编译(precompiled_header),指定临时文件生成目录,使项目文件夹更干净(MOC_DIR,RCC_DIR, UI_DIR, OBJECTS_DIR),#pragma execution_character_set("UTF-8")"这个命令是在编译时产生作用的,而不是运行时
- iOS Objective-C 笔记
- PHP中把stdClass Object转array(对象转数组)的几个方法
- [zz]Objective-C 内存管理精髓
- [zz]Objective-C 内存管理精髓
- [zz]Objective-C 内存管理精髓
- [zz]Objective-C 内存管理精髓