表 4-12 GetArrayRegion数组访问器例程系列

GetArrayRegion例程

数组类型

本地类型

GetBooleanArrayRegion()

jbooleanArray

jboolean

GetByteArrayRegion()

jbyteArray

jbyte

GetCharArrayRegion()

jcharArray

jchar

GetShortArrayRegion()

jshortArray

jhort

GetIntArrayRegion()

jintArray

jint

GetLongArrayRegion()

jlongArray

jlong

GetFloatArrayRegion()

jfloatArray

jloat

GetDoubleArrayRegion()

jdoubleArray

jdouble

参数:


env:JNI接口指针。


array:Java指针。


start:起始下标。


len:要复制的元素数。


buf:目的缓冲区。


抛出:


ArrayIndexOutOfBoundsException:如果区域中的某个下标无效。


SetArrayRegion例程


void   SetArrayRegion(JNIEnv *env, ArrayType array, 


jsize start, jsize len, NativeType *buf);


将基本类型数组的某一区域从缓冲区中复制回来的一组函数。


下表说明了特定的基本类型数组元素访问器。应进行如下替换:


将 SetArrayRegion 替换为表中的实际基本类型元素访问器例程名。


将 ArrayType 替换为对应的数组类型。


将 NativeType 替换为该例程对应的本地类型。


表 4-13 SetArrayRegion数组访问器例程系列

SetArrayRegion例程

数组类型

本地类型

SetBooleanArrayRegion()

jbooleanArray

jboolean

SetByteArrayRegion()

jbyteArray

jbyte

SetCharArrayRegion()

jcharArray

jchar

SetShortArrayRegion()

jshortArray

jshort

SetIntArrayRegion()

jintArray

jint

SetLongArrayRegion()

jlongArray

jlong

SetFloatArrayRegion()

jfloatArray

jfloat

SetDoubleArrayRegion()

jdoubleArray

jdouble

参数:


env:JNI接口指针。


array:  Java 数组。


start:起始下标。


len:要复制的元素数。


buf:源缓冲区。


抛出:


ArrayIndexOutOfBoundsException:如果区域中的某个下标无效。


访问对象的域

FindClass

jclass  FindClass(JNIEnv *env, const char *name);

该函数用于加载本地定义的类。它将搜索由CLASSPATH 环境变量为具有指定名称的类所指定的目录和 zip 文件。

参数:

env:JNI接口指针。

name:类全名(即包名后跟类名,之间由“/”分隔)。如果该名称以“[”(数组签名字符)打头,则返回一个数组类。

返回值:

返回类对象全名。如果找不到该类,则返回 NULL。

抛出:

ClassFormatError:如果类数据指定的类无效。

ClassCircularityError:如果类或接口是自身的超类或超接口。

NoClassDefFoundError:如果找不到所请求的类或接口的定义。

OutOfMemoryError:如果系统内存不足。


GetSuperclass

jclass  GetSuperclass(JNIEnv *env, jclass clazz);

如果 clazz 代表类而非类 object,则该函数返回由 clazz 所指定的类的超类。

如果 clazz 指定类 object 或代表某个接口,则该函数返回NULL。

参数:

env:JNI接口指针。

clazz:Java类对象。

返回值:

由 clazz 所代表的类的超类或 NULL。

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() 获得,且调用时的方法名必须为 ,而返回类型必须为 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类对象。


GetFieldID


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终结的 UTF-8字符串中的域名。


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


返回值:


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


抛出:


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


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


OutOfMemoryError:如果系统内存不足。


GetField例程


NativeType   GetField(JNIEnv*env, jobject obj, jfieldID fieldID);


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


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


表 4-1 GetField访问器例程系列


GetField例程名

本地类型


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。


返回值:


域的内容。


SetField例程


void   SetField(JNIEnv *env, jobject obj, jfieldID fieldID,


NativeType value);


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


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


表4-2 SetField访问器例程系列


SetField例程名

本地类型


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,应将  作为方法名,同时将 void (V)作为返回类型。

参数:

env:JNI接口指针。

clazz:Java类对象。

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

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

返回值:

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

抛出:

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

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

OutOfMemoryError:如果系统内存不足。

下面是java类型和年名类型的对照的一个表 

    Java类型     对应的签名booleanZbyteBcharCshrotSintIlongLfloatFdoubleDvoidVObjectL用/分割包的完整类名;  Ljava/lang/String;Array[签名       [I       [Ljava/lang/String;


CallMethod例程名

本地类型


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。


CallMethod例程的其它参数:


要传给 Java方法的参数。


CallMethodA例程的其它参数:


args:参数数组。


CallMethodV例程的其它参数:


args:参数的 va_list。


返回值:


返回调用 Java方法的结果。


抛出:


执行 Java方法时抛出的异常。

异常


Throw

jintThrow(JNIEnv *env, jthrowable obj);

抛出 java.lang.Throwable 对象。

参数:

env:JNI接口指针。

obj:java.lang.Throwable 对象。

返回值:

成功时返回 0,失败时返回负数。

抛出:

java.lang.Throwable 对象 obj。


ThrowNew

jint  ThrowNew(JNIEnv *env, jclass clazz, 

const char *message);

利用指定类的消息(由 message 指定)构造异常对象并抛出该异常。

参数:

env:JNI接口指针。

clazz:java.lang.Throwable 的子类。

message:用于构造java.lang.Throwable 对象的消息。

返回值:

成功时返回 0,失败时返回负数。

抛出:

新构造的 java.lang.Throwable 对象。


ExceptionOccurred

jthrowable  ExceptionOccurred(JNIEnv *env);

确定是否某个异常正被抛出。在平台相关代码调用 ExceptionClear() 或 Java 代码处理该异常前,异常将始终保持抛出状态。

参数:

env:JNI接口指针。

返回值:

返回正被抛出的异常对象,如果当前无异常被抛出,则返回NULL。


ExceptionDescribe

void  ExceptionDescribe(JNIEnv *env);

将异常及堆栈的回溯输出到系统错误报告信道(例如 stderr)。该例程可便利调试操作。

参数:

env:JNI接口指针。


ExceptionClear

void  ExceptionClear(JNIEnv *env);

清除当前抛出的任何异常。如果当前无异常,则此例程不产生任何效果。

参数:

env:JNI接口指针。


FatalError

void  FatalError(JNIEnv *env, const char *msg);

抛出致命错误并且不希望虚拟机进行修复。该函数无返回值。

参数:

env:JNI接口指针。

msg:错误消息。


全局及局部引用


NewGlobalRef

jobject  NewGlobalRef(JNIEnv *env, jobject obj);

创建 obj 参数所引用对象的新全局引用。obj 参数既可以是全局引用,也可以是局部引用。全局引用通过调用 DeleteGlobalRef() 来显式撤消。

参数:

env:JNI接口指针。

obj:全局或局部引用。

返回值:

返回全局引用。如果系统内存不足则返回 NULL。


DeleteGlobalRef

void  DeleteGlobalRef(JNIEnv *env, jobject globalRef);

删除 globalRef 所指向的全局引用。

参数:

env:JNI接口指针。

globalRef:全局引用。


DeleteLocalRef

void   DeleteLocalRef(JNIEnv *env, jobject localRef);

删除 localRef所指向的局部引用。

参数:

env:JNI接口指针。

localRef:局部引用。

更多相关文章

  1. Android(安卓)自定义时钟控件
  2. Android(安卓)剪切板ClipboardManager过时问题
  3. Android(安卓)Layout inflate分析(2) - ViewGroup
  4. unity和Android交互(内容部分为转载)
  5. Android(安卓)数据存储(数据库、文件、参数)操作实例
  6. android post get
  7. Android(安卓)optionsmenu例程
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. 留言板功能
  2. 常用的函数类型和常用的数据类型
  3. 留言板与自动客服
  4. javascript-基础(四)实战
  5. javascript-基础(三)
  6. Dom实战:留言板
  7. java tapestry5 布局 参数的处理
  8. JSP 传递中文参数的例子
  9. php实现JWT验证的实例教程
  10. PHP快速导出百万级数据到CSV或者EXCEL文