Android(Java):Android(安卓)jni学习(二)
表 4-12 Get
Get
数组类型
本地类型
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:如果区域中的某个下标无效。
Set
void Set
jsize start, jsize len, NativeType *buf);
将基本类型数组的某一区域从缓冲区中复制回来的一组函数。
下表说明了特定的基本类型数组元素访问器。应进行如下替换:
将 Set
将 ArrayType 替换为对应的数组类型。
将 NativeType 替换为该例程对应的本地类型。
表 4-13 Set
Set
数组类型
本地类型
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() 获得,且调用时的方法名必须为
******************************************************************************************************************************************
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。该域由其名称及签名指定。访问器函数的Get
GetFieldID() 将未初始化的类初始化。
GetFieldID() 不能用于获取数组的长度域。应使用GetArrayLength()。
参数:
env:JNI接口指针。
clazz:Java类对象。
name:0终结的 UTF-8字符串中的域名。
sig:0终结的 UTF-8字符串中的域签名。
返回值:
域 ID。如果操作失败,则返回NULL。
抛出:
NoSuchFieldError:如果找不到指定的域。
ExceptionInInitializerError:如果由于异常而导致类初始化程序失败。
OutOfMemoryError:如果系统内存不足。
Get
NativeType Get
该访问器例程系列返回对象的实例(非静态)域的值。要访问的域由通过调用GetFieldID() 而得到的域 ID 指定。
下表说明了 Get
表 4-1 Get
Get
本地类型
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
void Set
NativeType value);
该访问器例程系列设置对象的实例(非静态)域的值。要访问的域由通过调用SetFieldID() 而得到的域 ID 指定。
下表说明了 Set
表4-2 Set
Set
本地类型
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,应将
参数:
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;
Call
本地类型
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。
Call
要传给 Java方法的参数。
Call
args:参数数组。
Call
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:局部引用。
更多相关文章
- Android(安卓)自定义时钟控件
- Android(安卓)剪切板ClipboardManager过时问题
- Android(安卓)Layout inflate分析(2) - ViewGroup
- unity和Android交互(内容部分为转载)
- Android(安卓)数据存储(数据库、文件、参数)操作实例
- android post get
- Android(安卓)optionsmenu例程
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- Python技巧匿名函数、回调函数和高阶函数