【安卓开发】JNI常用接口 - 3

6、对象操作
jobject AllocObject(JNIEnv *env, jclass clazz);
不借助任何构建器的情况下分配一个新的JAVA对象,返回对象的一个引用。
参数clazz不能指向一个数组类。
参数:
env:JNI接口指针
clazz:java类对象
返回:
返回一个java对象,如果该对象无法被创建,返回NULL
异常:
InstantiationException 如果类是接口或者抽象类
OutOfMemoryError 如果系统内存溢出

jobject NewObject(JNIEnv *env, jclass clazz,jmethodID methodID, …);
jobject NewObjectA(JNIEnv *env, jclass clazz,jmethodID methodID, const jvalue *args);
jobject NewObjectV(JNIEnv *env, jclass clazz,jmethodID methodID, va_list args);
构建一个新的JAVA对象,methodID表明需要借助哪一个构建函数方法,这个ID必须通过调用GetMethodID()获得,GetMethodID()中为方法名,void(V)为返回类型。

clazz参数不能指向一个数组类。

NewObject : 编程者把需要传递给构造函数的所有参数放在参数methodID之后。NewObject()接受这些参数并且将他们传递给需要调用的JAVA方法。

NewObjectA :编程人员在methodID之后,放置一个类型为jvalue的args数组,该数组存放所有需要传递给构造函数的参数。NewObjectA()接收在这个数组中的所有的参数,并且按照顺序将它们传递给需要调用的JAVA方法。

NewObjectV :编程人员在在methodID之后,放置一个类型为va_list 的args,该参数存放所有需要传递给构造函数的参数。NewObjectV ()接收所有的参数,并且按照顺序将它们传递给需要调用的JAVA方法

返回:
JAVA对象,如果对象无法被创建则返回NULL

异常:
InstantiationException:如果类是接口或者抽象类
OutOfMemoryError:如果系统内存溢出
所有的异常通过构造函数抛出。

jclass GetObjectClass(JNIEnv *env, jobject obj);
返回obj对应的类

参数:
env:JNI接口指针
obj:JAVA对象,不能为NULL

返回:
返回一个java类对象

jobjectRefType GetObjectRefType(JNIEnv* env, jobject obj);
返回obj参数指向的对象的类型,参数obj可以是局部、全局或者弱全局引用

参数:
env:JNI接口指针
obj:局部、全局或者弱全局引用

返回:
JNIInvalidRefType = 0,
JNILocalRefType = 1,
JNIGlobalRefType = 2,
JNIWeakGlobalRefType = 3

该函数不能用在被删除的引用。

jboolean IsInstanceOf(JNIEnv *env, jobject obj,jclass clazz);
测试obj是否clazz的一个实例

参数:
env:JNI接口指针
obj:一个JAVA对象
clazz:一个JAVA类对象

返回:
如果obj是clazz的实例,返回JNI_TRUE;否则返回JNI_FALSE;一个空对象obj可以是任何类的实例。

jboolean IsSameObject(JNIEnv *env, jobject ref1,jobject ref2);
测试两个引用是否指向同一个类对象。

参数:
env:JNI接口指针
ref1:java对象
ref2:java对象

返回:
如果同一个类对象,返回JNI_TRUE;否则,返回JNI_FALSE;

jfieldID GetFieldID(JNIEnv *env, jclass clazz,const char *name, const char *sig);
返回类的一个实例(非静态)对应的域ID,该域通过其名字及签名被定义。 GetField和SetField接口通过这个域ID获取对象域。

GetFieldID()将造成未被初始化的类进行初始化。
GetFieldID()不能用来获取数组的长度域,可使用GetArrayLength()获取。

参数:
env:JNI接口指针
clazz:JAVA类对象
name:域的名称,以0结尾的modified UTF-8字符串
sig:域签名,以0结尾的modified UTF-8字符串
返回:
域ID,如果操作失败返回NULL
异常:
NoSuchFieldError:如果找不到指定的域
ExceptionInInitializerError:如果类初始化失败
OutOfMemoryError:如果系统内存溢出

NativeType GetField(JNIEnv *env, jobject obj,jfieldID fieldID);
返回类的实例(非静态)的值。这是一组函数的统称,其中为JAVA 类型;NativeType为对应的本地类型。
具体的接口如下:
GetField Routine Name
Native Type
GetObjectField()
jobject
GetBooleanField()
jboolean
GetByteField()
jbyte
GetCharField()
jchar
GetShortField()
jshort
GetIntField()
jint
GetLongField()
jlong
GetFloatField()
jfloat
GetDoubleField()
jdouble

参数:
env:JNI接口指针
obj:JAVA对象,不能为空
fieldID:有效的fieldID

返回:
对应域的内容。

void SetField(JNIEnv *env, jobject obj, jfieldID fieldID,NativeType value);
设置域的值。
SetField Routine
Native Type
SetObjectField()
jobject
SetBooleanField()
jboolean
SetByteField()
jbyte
SetCharField()
jchar
SetShortField()
jshort
SetIntField()
jint
SetLongField()
jlong
SetFloatField()
jfloat
SetDoubleField()
jdouble
参数:
env:JNI接口指针
obj:JAVA对象,不能为空
fieldID:有效的域ID
value:域的新值

7、访问对象

jmethodID GetMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);
返回类或者接口的实例方法的ID,该方法可以是被定义在clazz的超类中然后被clazz所继承。该方法可以根据名字或者签名所定义。

GetMethodID()将造成未被初始化的类进行初始化。

为了获取构造函数的方法ID,使用当作方法的名字及void(V)作为返回类型。

参数:
env:JNI接口指针
clazz:java类对象
name:方法的名称,以0结尾的modified UTF-8字符串
sig:方法的签名,以0结尾的modified UTF-8字符串
返回:
返回一个方法ID,如果指定的方法不能被找到返回NULL
异常:
NoSuchMethodError:如果找不到指定的方法
ExceptionInInitializerError:如果类初始化失败
OutOfMemoryError:如果系统内存溢出

NativeType CallMethod(JNIEnv *env, jobject obj,jmethodID methodID, …);
NativeType CallMethodA(JNIEnv *env, jobject obj,jmethodID methodID, const jvalue *args);
NativeType CallMethodV(JNIEnv *env, jobject obj,jmethodID methodID, va_list args);
这一系列里的方法用来从一个本地方法中调用JAVA实例方法,它们只在才把参数传递至调用的方法上有所不同而已。
这一系列的操作根据所指定的方法ID调用Java对象上的实例方法(非静态),methodID参数需要调用GetMethodID()获取。

当这些方法用来调用私有方法及构造函数时,method ID必须来源于obj真正的类,而不是它的超类。

CallMethod: 编程者把需要传递给函数的所有参数放在参数methodID之后。CallMethod()接受这些参数并且将他们传递给需要调用的JAVA方法。

CallMethodA:编程人员在methodID之后,放置一个类型为jvalue的args数组,该数组存放所有需要传递给构造函数的参数。CallMethodA()接收在这个数组中的所有的参数,并且按照顺序将它们传递给需要调用的JAVA方法。

CallMethodV:编程人员在在methodID之后,放置一个类型为va_list 的args,该参数存放所有需要传递给构造函数的参数。CallMethodV()接收所有的参数,并且按照顺序将它们传递给需要调用的JAVA方法

根据不同的,我们可以得到下列的接口

CallMethod Routine Name
Native Type
CallVoidMethod()
CallVoidMethodA()
CallVoidMethodV()
void
CallObjectMethod()
CallObjectMethodA()
CallObjectMethodV()
jobject
CallBooleanMethod()
CallBooleanMethodA()
CallBooleanMethodV()
jboolean
CallByteMethod()
CallByteMethodA()
CallByteMethodV()
jbyte
CallCharMethod()
CallCharMethodA()
CallCharMethodV()
jchar
CallShortMethod()
CallShortMethodA()
CallShortMethodV()
jshort
CallIntMethod()
CallIntMethodA()
CallIntMethodV()
jint
CallLongMethod()
CallLongMethodA()
CallLongMethodV()
jlong
CallFloatMethod()
CallFloatMethodA()
CallFloatMethodV()
jfloat
CallDoubleMethod()
CallDoubleMethodA()
CallDoubleMethodV()
jdouble
参数:
env:JNI接口指针
obj:一个java对象
methodID:方法ID
返回:
返回所调用的JAVA方法的结果。
抛出异常:
在JAVA方法执行过程中产生异常。

NativeType CallNonvirtualMethod(JNIEnv *env, jobject obj,jclass clazz, jmethodID methodID, …);
NativeType CallNonvirtualMethodA(JNIEnv *env, jobject obj,jclass clazz, jmethodID methodID, const jvalue *args);
NativeType CallNonvirtualMethodV(JNIEnv *env, jobject obj,jclass clazz, jmethodID methodID, va_list args);
这些系列的操作根据特定的类及方法ID调用JAVA对象的实例方法(非静态),methodID参数需要调用GetMethodID()获取。
这与上面的 CallMethod 不同, CallMethod 基于对象的类调用方法而CallNonvirtualMethod基于类调用方法,由clazz指定。method ID必须来源于obj真正的类,而不是它的超类。
CallNonvirtualMethod Routine Name
Native Type
CallNonvirtualVoidMethod()
CallNonvirtualVoidMethodA()
CallNonvirtualVoidMethodV()
void
CallNonvirtualObjectMethod()
CallNonvirtualObjectMethodA()
CallNonvirtualObjectMethodV()
jobject
CallNonvirtualBooleanMethod()
CallNonvirtualBooleanMethodA()
CallNonvirtualBooleanMethodV()
jboolean
CallNonvirtualByteMethod()
CallNonvirtualByteMethodA()
CallNonvirtualByteMethodV()
jbyte
CallNonvirtualCharMethod()
CallNonvirtualCharMethodA()
CallNonvirtualCharMethodV()
jchar
CallNonvirtualShortMethod()
CallNonvirtualShortMethodA()
CallNonvirtualShortMethodV()
jshort
CallNonvirtualIntMethod()
CallNonvirtualIntMethodA()
CallNonvirtualIntMethodV()
jint
CallNonvirtualLongMethod()
CallNonvirtualLongMethodA()
CallNonvirtualLongMethodV()
jlong
CallNonvirtualFloatMethod()
CallNonvirtualFloatMethodA()
CallNonvirtualFloatMethodV()
jfloat
CallNonvirtualDoubleMethod()
CallNonvirtualDoubleMethodA()
CallNonvirtualDoubleMethodV()
jdouble
参数:
env:JNI接口指针
clazz:java类
obj:java对象
methodID:方法ID
返回:
调用的JAVA方法的结果
抛出异常:
在JAVA方法执行过程中产生异常。

8、调用静态函数

jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz,const char *name, const char *sig);
为类的静态域返回域ID,这个域通过其名字及签名指定, GetStaticField 及SetStaticField通过使用域ID获取静态域
GetStaticFieldID()会引起未初始化的类进行初始化。

参数:
env:JNI接口指针
clazz:java类对象
name:静态域名字,0结尾的modifiedUTF-8字符串
sig:域签名,0结尾的modifiedUTF-8字符串
返回:
返回域ID,如果指定的静态域无法找到则返回NULL
抛出异常:
NoSuchFieldError:如果指定的静态域无法被找到
ExceptionInInitializerError:如果类初始化失败
OutOfMemoryError:如果系统内存溢出

NativeType GetStaticField(JNIEnv *env, jclass clazz,jfieldID fieldID);
这系列的函数返回对象静态域的值,该域由域ID指定,域ID可以通过GetStaticFieldID()获得。

GetStaticField Routine Name
Native Type
GetStaticObjectField()
jobject
GetStaticBooleanField()
jboolean
GetStaticByteField()
jbyte
GetStaticCharField()
jchar
GetStaticShortField()
jshort
GetStaticIntField()
jint
GetStaticLongField()
jlong
GetStaticFloatField()
jfloat
GetStaticDoubleField()
jdouble
参数:
env:JNI接口指针
clazz:java类对象
fieldID:静态域ID
返回:
返回静态域内容

void SetStaticField(JNIEnv *env, jclass clazz,jfieldID fieldID, NativeType value);
设置静态域的值,静态域由域ID指定,域ID可以通过 GetStaticFieldID()获取。
SetStaticField Routine Name
NativeType
SetStaticObjectField()
jobject
SetStaticBooleanField()
jboolean
SetStaticByteField()
jbyte
SetStaticCharField()
jchar
SetStaticShortField()
jshort
SetStaticIntField()
jint
SetStaticLongField()
jlong
SetStaticFloatField()
jfloat
SetStaticDoubleField()
jdouble
参数:
env:JNI接口指针
clazz:java类对象
fieldID:静态域ID
value:设置的值

jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);
返回类的静态方法的ID,方法通过他的名字及签名被指定。
GetStaticMethodID()会引起一个未被初始化的类初始化。

参数:
env:JNI接口指针
clazz:java类对象
name:静态方法名字, 以0结尾的modifiedUTF-8字符串
sig:方法签名,以0结尾的modifiedUTF-8字符串
返回:
返回方法ID,如果操作失败返回NULL
抛出异常:
NoSuchMethodError:如果指定的静态方法无法被找到
ExceptionInInitializerError:如果类初始化失败
OutOfMemoryError:如果系统内存溢出

NativeType CallStaticMethod(JNIEnv *env, jclass clazz,jmethodID methodID, …);
NativeType CallStaticMethodA(JNIEnv *env, jclass clazz,jmethodID methodID, jvalue *args);
NativeType CallStaticMethodV(JNIEnv *env, jclass clazz,jmethodID methodID, va_list args);
这系列的操作调用一个java对象的静态方法,根据指定的方法ID,方法ID可以通过GetStaticMethodID()获取
方法ID必须来自于clazz,而不是其超集

CallStaticVoidMethod()
CallStaticVoidMethodA()
CallStaticVoidMethodV()
void
CallStaticObjectMethod()
CallStaticObjectMethodA()
CallStaticObjectMethodV()
jobject
CallStaticBooleanMethod()
CallStaticBooleanMethodA()
CallStaticBooleanMethodV()
jboolean
CallStaticByteMethod()
CallStaticByteMethodA()
CallStaticByteMethodV()
jbyte
CallStaticCharMethod()
CallStaticCharMethodA()
CallStaticCharMethodV()
jchar
CallStaticShortMethod()
CallStaticShortMethodA()
CallStaticShortMethodV()
jshort
CallStaticIntMethod()
CallStaticIntMethodA()
CallStaticIntMethodV()
jint
CallStaticLongMethod()
CallStaticLongMethodA()
CallStaticLongMethodV()
jlong
CallStaticFloatMethod()
CallStaticFloatMethodA()
CallStaticFloatMethodV()
jfloat
CallStaticDoubleMethod()
CallStaticDoubleMethodA()
CallStaticDoubleMethodV()
jdouble
参数:
env:JNI接口指针
clazz:java类对象
methodID:静态方法ID
返回:
返回静态java方法的结果
抛出异常:
在java 方法执行中抛出异常。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值