JNI函数
本章为JNI函数提供参考信息。其中列出了全部JNI函数,同时也给出了JNI函数表的准确布局。注意:“必须”一词用于约束JNI编程人员。例如,当说明某个JNI函数必须接收非空对象时,就应确保不要向该JNI函数传递NULL值。这时,JNI实现将无需在该JNI函数中执行NULL指针检查。
接口函数表
每个函数均可通过JNIEnv参数以固定偏移量进行访问。JNIEnv的类型是一个指针,指向存储全部JNI函数指针的结构。注意:前三项留作将来与COM兼容。此外,我们在函数表开头部分也留出来多个NULL项,从而可将将来与类有关的JNI操作添加到FindClass后面,而非函数表的末尾。注意,函数表可在所有JNI接口指针间共享。
const struct JNINativeInterface ... = {
NULL,
NULL,
NULL,
NULL,
GetVersion,
DefineClass,
FindClass,
NULL,
NULL,
NULL,
GetSuperclass,
IsAssignableFrom,
NULL,
Throw,
ThrowNew,
ExceptionOccurred,
ExceptionDescribe,
ExceptionClear,
FatalError,
NULL,
NULL,
NewGlobalRef,
DeleteGlobalRef,
DeleteLocalRef,
IsSameObject,
NULL,
NULL,
AllocObject,
NewObject,
NewObjectV,
NewObjectA,
GetObjectClass,
IsInstanceOf,
GetMethodID,
CallObjectMethod,
CallObjectMethodV,
CallObjectMethodA,
CallBooleanMethod,
CallBooleanMethodV,
CallBooleanMethodA,
CallByteMethod,
CallByteMethodV,
CallByteMethodA,
CallCharMethod,
CallCharMethodV,
CallCharMethodA,
CallShortMethod,
CallShortMethodV,
CallShortMethodA,
CallIntMethod,
CallIntMethodV,
CallIntMethodA,
CallLongMethod,
CallLongMethodV,
CallLongMethodA,
CallFloatMethod,
CallFloatMethodV,
CallFloatMethodA,
CallDoubleMethod,
CallDoubleMethodV,
CallDoubleMethodA,
CallVoidMethod,
CallVoidMethodV,
CallVoidMethodA,
CallNonvirtualObjectMethod,
CallNonvirtualObjectMethodV,
CallNonvirtualObjectMethodA,
CallNonvirtualBooleanMethod,
CallNonvirtualBooleanMethodV,
CallNonvirtualBooleanMethodA,
CallNonvirtualByteMethod,
CallNonvirtualByteMethodV,
CallNonvirtualByteMethodA,
CallNonvirtualCharMethod,
CallNonvirtualCharMethodV,
CallNonvirtualCharMethodA,
CallNonvirtualShortMethod,
CallNonvirtualShortMethodV,
CallNonvirtualShortMethodA,
CallNonvirtualIntMethod,
CallNonvirtualIntMethodV,
CallNonvirtualIntMethodA,
CallNonvirtualLongMethod,
CallNonvirtualLongMethodV,
CallNonvirtualLongMethodA,
CallNonvirtualFloatMethod,
CallNonvirtualFloatMethodV,
CallNonvirtualFloatMethodA,
CallNonvirtualDoubleMethod,
CallNonvirtualDoubleMethodV,
CallNonvirtualDoubleMethodA,
CallNonvirtualVoidMethod,
CallNonvirtualVoidMethodV,
CallNonvirtualVoidMethodA,
GetFieldID,
GetObjectField,
GetBooleanField,
GetByteField,
GetCharField,
GetShortField,
GetIntField,
GetLongField,
GetFloatField,
GetDoubleField,
SetObjectField,
SetBooleanField,
SetByteField,
SetCharField,
SetShortField,
SetIntField,
SetLongField,
SetFloatField,
SetDoubleField,
GetStaticMethodID,
CallStaticObjectMethod,
CallStaticObjectMethodV,
CallStaticObjectMethodA,
CallStaticBooleanMethod,
CallStaticBooleanMethodV,
CallStaticBooleanMethodA,
CallStaticByteMethod,
CallStaticByteMethodV,
CallStaticByteMethodA,
CallStaticCharMethod,
CallStaticCharMethodV,
CallStaticCharMethodA,
CallStaticShortMethod,
CallStaticShortMethodV,
CallStaticShortMethodA,
CallStaticIntMethod,
CallStaticIntMethodV,
CallStaticIntMethodA,
CallStaticLongMethod,
CallStaticLongMethodV,
CallStaticLongMethodA,
CallStaticFloatMethod,
CallStaticFloatMethodV,
CallStaticFloatMethodA,
CallStaticDoubleMethod,
CallStaticDoubleMethodV,
CallStaticDoubleMethodA,
CallStaticVoidMethod,
CallStaticVoidMethodV,
CallStaticVoidMethodA,
GetStaticFieldID,
GetStaticObjectField,
GetStaticBooleanField,
GetStaticByteField,
GetStaticCharField,
GetStaticShortField,
GetStaticIntField,
GetStaticLongField,
GetStaticFloatField,
GetStaticDoubleField,
SetStaticObjectField,
SetStaticBooleanField,
SetStaticByteField,
SetStaticCharField,
SetStaticShortField,
SetStaticIntField,
SetStaticLongField,
SetStaticFloatField,
SetStaticDoubleField,
NewString,
GetStringLength,
GetStringChars,
ReleaseStringChars,
NewStringUTF,
GetStringUTFLength,
GetStringUTFChars,
ReleaseStringUTFChars,
GetArrayLength,
NewObjectArray,
GetObjectArrayElement,
SetObjectArrayElement,
NewBooleanArray,
NewByteArray,
NewCharArray,
NewShortArray,
NewIntArray,
NewLongArray,
NewFloatArray,
NewDoubleArray,
GetBooleanArrayElements,
GetByteArrayElements,
GetCharArrayElements,
GetShortArrayElements,
GetIntArrayElements,
GetLongArrayElements,
GetFloatArrayElements,
GetDoubleArrayElements,
ReleaseBooleanArrayElements,
ReleaseByteArrayElements,
ReleaseCharArrayElements,
ReleaseShortArrayElements,
ReleaseIntArrayElements,
ReleaseLongArrayElements,
ReleaseFloatArrayElements,
ReleaseDoubleArrayElements,
GetBooleanArrayRegion,
GetByteArrayRegion,
GetCharArrayRegion,
GetShortArrayRegion,
GetIntArrayRegion,
GetLongArrayRegion,
GetFloatArrayRegion,
GetDoubleArrayRegion,
SetBooleanArrayRegion,
SetByteArrayRegion,
SetCharArrayRegion,
SetShortArrayRegion,
SetIntArrayRegion,
SetLongArrayRegion,
SetFloatArrayRegion,
SetDoubleArrayRegion,
RegisterNatives,
UnregisterNatives,
MonitorEnter,
MonitorExit,
GetJavaVM,
};
版本信息
GetVersion( )返回本地方法接口的版本。
jint GetVersion(JNIEnv *env);
参数 :
env为JNI接口指针。返回值:
高16位返回主版本号,低16位返回次版本号。
在JDK1.1 中,GetVersion()返回0x00010001。
类操作
DefineClass( )从原始类数据的缓冲区中加载类。
jclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);
参数:
env:JNI 接口指针。
loader:分派给所定义的类的类加载器。
buf:包含.class文件数据的缓冲区。
bufLen:缓冲区长度。返回值:
返回Java类对象。如果出错则返回NULL。抛出的异常:
- ClassFormatError:如果类数据指定的类无效。
- ClassCircularityError:如果类或接口是自身的超类或超接口。
- OutOfMemoryError:如果系统内存不足。
FindClass( ) 该函数用于加载本地定义的类。它将搜索由CLASSPATH环境变量为具有指定名称的类所指定的目录和zip文件。
jclass FindClass(JNIEnv *env, const char *name);
参数:
env:JNI接口指针。
name:类全名(即包名后跟类名,之间由“/”分隔)。如果该名称以“[”(数组签名字符)打头,则返回一个数组类。返回值:
返回类对象全名。如果找不到该类,则返回NULL。抛出:
- ClassFormatError:如果类数据指定的类无效。
- ClassCircularityError:如果类或接口是自身的超类或超接口。
- NoClassDefFoundError:如果找不到所请求的类或接口的定义。
- OutOfMemoryError:如果系统内存不足。
GetSuperclass( ) 如果clazz代表类而非类object,则该函数返回由clazz所指定的类的超类。如果clazz指定类object或代表某个接口,则该函数返回NULL。
jclass GetSuperclass(JNIEnv *env, jclass clazz);
参数:
env:JNI接口指针。
clazz:Java类对象。返回值:
由clazz所代表的类的超类或NULL。
IsAssignableFrom ( ) 确定clazz1的对象是否可安全地强制转换为clazz2。
jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1, jclass clazz2);
参数:
env:JNI接口指针。
clazz1:第一个类参数。
clazz2:第二个类参数。返回值:
下列某个情况为真时返回JNI_TRUE:
第一及第二个类参数引用同一个Java类。
第一个类是第二个类的子类。
第二个类是第一个类的某个接口。
异常
Throw( ) 抛出java.lang.Throwable对象。
jint Throw(JNIEnv *env, jthrowable obj);
参数:
env:JNI接口指针。
obj:java.lang.Throwable对象。返回值:
成功时返回0,失败时返回负数。抛出:
java.lang.Throwable对象obj。
ThrowNew( )利用指定类的消息(由message指定)构造异常对象并抛出该异常。
jint ThrowNew(JNIEnv *env, jclass clazz, const char *message);
参数:
env:JNI接口指针。
clazz:java.lang.Throwable的子类。
message:用于构造java.lang.Throwable对象的消息。返回值:
成功时返回0,失败时返回负数。抛出:
新构造的java.lang.Throwable对象。
ExceptionOccurred( ) 确定是否某个异常正被抛出。在平台相关代码调用ExceptionClear()或Java代码处理该异常前,异常将始终保持抛出状态。
jthrowable ExceptionOccurred(JNIEnv *env);
参数:
env:JNI接口指针。返回值:
返回正被抛出的异常对象,如果当前无异常被抛出,则返回NULL。
ExceptionDescribe( ) 将异常及堆栈的回溯输出到系统错误报告信道(例如 stderr)。该例程可便利调试操作。
void ExceptionDescribe(JNIEnv *env);
参数:
env:JNI接口指针。
ExceptionClear( ) 清除当前抛出的任何异常。如果当前无异常,则此例程不产生任何效果。
void ExceptionClear(JNIEnv *env);
参数:
env:JNI接口指针。
FatalError( )抛出致命错误并且不希望虚拟机进行修复。该函数无返回值。
void FatalError(JNIEnv *env, const char *msg);
参数:
env:JNI接口指针。
msg:错误消息。
全局及局部引用
NewGlobalRef( ) 创建obj参数所引用对象的新全局引用。obj参数既可以是全局引用,也可以是局部引用。全局引用通过调用DeleteGlobalRef()来显式撤消。
jobject NewGlobalRef(JNIEnv *env, jobject obj);
参数:
env:JNI接口指针。
obj:全局或局部引用。返回值:
返回全局引用。如果系统内存不足则返回NULL。
DeleteGlobalRef( ) 删除globalRef所指向的全局引用。
void DeleteGlobalRef(JNIEnv *env, jobject globalRef);
参数:
env:JNI接口指针。
globalRef:全局引用。
DeleteLocalRef( ) 删除localRef所指向的局部引用。
void DeleteLocalRef(JNIEnv *env, jobject localRef);
参数:
env:JNI接口指针。
localRef:局部引用。
对象操作
AllocObject( ) 分配新Java对象而不调用该对象的任何构造函数。返回该对象的引用。clazz参数务必不要引用数组类。
jobject AllocObject(JNIEnv *env, jclass clazz);
参数:
env:JNI接口指针。
clazz:Java类对象。返回值:
返回Java对象。如果无法构造该对象,则返回NULL。抛出:
InstantiationException:如果该类为一个接口或抽象类。
OutOfMemoryError:如果系统内存不足。
NewObject( ) NewObjectA