现在的位置: 首页 > 综合 > 正文

JNI接口函数<二>

2013年08月25日 ⁄ 综合 ⁄ 共 4005字 ⁄ 字号 评论关闭

对象操作

 

AllocObject

jobject  AllocObject(JNIEnv *env, jclass clazz);

分配新 Java 对象而不调用该对象的任何构造函数。返回该对象的引用。

clazz 参数务必不要引用数组类。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

返回值:

返回 Java 对象。如果无法构造该对象,则返回NULL

抛出:

InstantiationException:如果该类为一个接口或抽象类。

OutOfMemoryError:如果系统内存不足。

 

NewObject
NewObjectA
NewObjectV

jobject  NewObject(JNIEnv *env, jclass clazz, 
jmethodID methodID, ...);

jobject NewObjectA(JNIEnv *env,jclass clazz, 
jmethodID methodID, jvalue *args);

jobject NewObjectV(JNIEnv *env,jclass clazz, 
jmethodID methodID, va_list args);

构造新 Java 对象。方法 ID指示应调用的构造函数方法。该 ID 必须通过调用 GetMethodID() 获得,且调用时的方法名必须为 <init>,而返回类型必须为 void (V)。

clazz参数务必不要引用数组类。

NewObject

编程人员应将传递给构造函数的所有参数紧跟着放在 methodID 参数的后面。NewObject() 收到这些参数后,将把它们传给编程人员所要调用的 Java 方法。

NewObjectA

编程人员应将传递给构造函数的所有参数放在 jvalues 类型的数组 args 中,该数组紧跟着放在 methodID 参数的后面。NewObject() 收到数组中的这些参数后,将把它们传给编程人员所要调用的 Java 方法。

NewObjectV

编程人员应将传递给构造函数的所有参数放在 va_list 类型的参数 args 中,该参数紧跟着放在 methodID 参数的后面。NewObject() 收到这些参数后,将把它们传给编程人员所要调用的 Java 方法。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

methodID:构造函数的方法 ID。

NewObject 的其它参数:

传给构造函数的参数。

NewObjectA 的其它参数:

args:传给构造函数的参数数组。

NewObjectV 的其它参数:

args:传给构造函数的参数 va_list。

返回值:

返回 Java 对象,如果无法构造该对象,则返回NULL

抛出:

InstantiationException:如果该类为接口或抽象类。

OutOfMemoryError:如果系统内存不足。

构造函数抛出的任何异常。

 

GetObjectClass

jclass  GetObjectClass(JNIEnv *env, jobject obj);

返回对象的类。

参数:

env:JNI 接口指针。

obj:Java 对象(不能为 NULL)。

返回值:

返回 Java 类对象。

 

IsInstanceOf

jboolean  IsInstanceOf(JNIEnv *env, jobject obj, 
jclass clazz);

测试对象是否为某个类的实例。

参数:

env:JNI 接口指针。

obj:Java 对象。

clazz:Java 类对象。

返回值:

如果可将 obj 强制转换为 clazz,则返回 JNI_TRUE。否则返回 JNI_FALSENULL 对象可强制转换为任何类。

 

IsSameObject

jbooleanIsSameObject(JNIEnv *env, jobject ref1, 
jobject ref2);

测试两个引用是否引用同一 Java 对象。

参数:

env:JNI 接口指针。

ref1:Java 对象。

ref2:Java 对象。

返回值:

如果 ref1 和 ref2 引用同一 Java 对象或均为 NULL,则返回 JNI_TRUE。否则返回 JNI_FALSE


访问对象的域

 

GetFieldID

jfieldID   GetFieldID(JNIEnv *env, jclass clazz, 
const char *name, const char *sig);

返回类的实例(非静态)域的域 ID。该域由其名称及签名指定。访问器函数的Get<type>Field 及 Set<type>Field 系列使用域 ID 检索对象域。

GetFieldID() 将未初始化的类初始化。

GetFieldID() 不能用于获取数组的长度域。应使用GetArrayLength()

参数:

env:JNI 接口指针。

clazz:Java 类对象。

name:0 终结的 UTF-8 字符串中的域名。

sig:0 终结的 UTF-8 字符串中的域签名。

返回值:

域 ID。如果操作失败,则返回NULL

抛出:

NoSuchFieldError:如果找不到指定的域。

ExceptionInInitializerError:如果由于异常而导致类初始化程序失败。

OutOfMemoryError:如果系统内存不足。

 

Get<type>Field 例程

NativeType   Get<type>Field(JNIEnv*env, jobject obj, 
jfieldID fieldID);

该访问器例程系列返回对象的实例(非静态)域的值。要访问的域由通过调用GetFieldID() 而得到的域 ID 指定。

下表说明了 Get<type>Field 例程名及结果类型。应将 Get<type>Field 中的 type 替换为域的 Java 类型(或使用表中的某个实际例程名),然后将NativeType 替换为该例程对应的本地类型。

表 4-1 Get<type>Field 访问器例程系列

Get<type>Field 例程名

本地类型

GetObjectField()

jobject

GetBooleanField()

jboolean

GetByteField()

jbyte

GetCharField()

jchar

GetShortField()

jshort

GetIntField()

jint

GetLongField()

jlong

GetFloatField()

jfloat

GetDoubleField()

jdouble

参数:

env:JNI 接口指针。

obj:Java 对象(不能为 NULL)。

fieldID:有效的域 ID。

返回值:

域的内容。

 

Set<type>Field 例程

void   Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID,
NativeType value);

该访问器例程系列设置对象的实例(非静态)域的值。要访问的域由通过调用SetFieldID() 而得到的域 ID 指定。

下表说明了 Set<type>Field 例程名及结果类型。应将 Set<type>Field 中的 type 替换为域的 Java 类型(或使用表中的某个实际例程名),然后将NativeType 替换为该例程对应的本地类型。

表4-2 Set<type>Field 访问器例程系列

Set<type>Field 例程名

本地类型

SetObjectField()

jobject

SetBooleanField()

jboolean

SetByteField()

jbyte

SetCharField()

jchar

SetShortField()

jshort

SetIntField()

jint

SetLongField()

jlong

SetFloatField()

jfloat

SetDoubleField()

jdouble

参数:

env:JNI 接口指针。

obj:Java 对象(不能为 NULL)。

fieldID:有效的域 ID。

value:域的新值。


调用实例方法

 

GetMethodID

jmethodID  GetMethodID(JNIEnv *env, jclass clazz, 
const char *name, const char *sig);

返回类或接口实例(非静态)方法的方法 ID。方法可在某个 clazz 的超类中定义,也可从 clazz 继承。该方法由其名称和签名决定。

GetMethodID() 可使未初始化的类初始化。

要获得构造函数的方法 ID,应将 <init> 作为方法名,同时将 void (V) 作为返回类型。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

name:0 终结的 UTF-8 字符串中的方法名。

sig:0 终结的 UTF-8 字符串中的方法签名。

返回值:

方法 ID,如果找不到指定的方法,则为 NULL

抛出:

NoSuchMethodError:如果找不到指定方法。

ExceptionInInitializerError:如果由于异常而导致类初始化程序失败。

OutOfMemoryError:如果系统内存不足。

 

Call<type>Method 例程
Call<type>MethodA 例程
Call<type>MethodV 例程

NativeType   Call<type>Method(JNIEnv*env, jobject obj, 
jmethodID methodID, ...);

NativeType  Call<type>MethodA(JNIEnv *env, jobject obj, 
jmethodID methodID, jvalue *args);

NativeType  Call<type>MethodV(JNIEnv *env, jobject obj, 
jmethodID methodID, va_list args);

这三个操作的方法用于从本地方法调用Java 实例方法。它们的差别仅在于向其所调用的方法传递参数时所用的机制。

抱歉!评论已关闭.