《JNI常用函数(整理)》由会员分享,可在线阅读,更多相关《JNI常用函数(整理)(20页珍藏版)》请在金锄头文库上搜索。
1、JNI 常用函数(整理)常用函数(整理)1.类操作类操作1) DefineClassjclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);从原始类数据的缓冲区中加载类。 参数: env:JNI 接口指针。 loader:分派给所定义的类的类加载器。 buf:包含 .class 文件数据的缓冲区。 bufLen:缓冲区长度。 返回值: 返回 Java 类对象。如果出错则返回 NULL。 抛出: ClassFormatError:如果类数据指定的类无效。 ClassCircularityErr
2、or:如果类或接口是自身的超类或超接口。 OutOfMemoryError:如果系统内存不足。2) FindClassjclass FindClass(JNIEnv *env, const char *name);该函数用于加载本地定义的类。它将搜索由 CLASSPATH 环境变量为具有指定名称的类所指 定的目录和 zip 文件。 参数: env:JNI 接口指针。 name:类全名(即包名后跟类名,之间由“/”分隔) 。如果该名称以“” (数组签名 字符)打头,则返回一个数组类。 返回值: 返回类对象全名。如果找不到该类,则返回 NULL。 抛出: ClassFormatError:如果类数
3、据指定的类无效。 ClassCircularityError:如果类或接口是自身的超类或超接口。 NoClassDefFoundError:如果找不到所请求的类或接口的定义。 OutOfMemoryError:如果系统内存不足。3) GetSuperclassjclass GetSuperclass(JNIEnv *env, jclass clazz);如果 clazz 代表类而非类 object,则该函数返回由 clazz 所指定的类的超类。 如果 clazz 指定类 object 或代表某个接口,则该函数返回 NULL。 参数: env:JNI 接口指针。 clazz:Java 类对象。
4、返回值: 由 clazz 所代表的类的超类或 NULL。4) IsAssignableFromjboolean IsAssignableFrom(JNIEnv *env, jclass clazz1, jclass clazz2);确定 clazz1 的对象是否可安全地强制转换为 clazz2。 参数: env:JNI 接口指针。 clazz1:第一个类参数。 clazz2:第二个类参数。 返回值: 下列某个情况为真时返回 JNI_TRUE: 1)第一及第二个类参数引用同一个 Java 类。 2)第一个类是第二个类的子类。 3)第二个类是第一个类的某个接口。2.异常异常1) Throwjint
5、 Throw(JNIEnv *env, jthrowable obj);抛出 java.lang.Throwable 对象。 参数: env:JNI 接口指针。 obj:java.lang.Throwable 对象。 返回值:成功时返回 0,失败时返回负数。 抛出: java.lang.Throwable 对象 obj。2) ThrowNewjint ThrowNew(JNIEnv *env, jclass clazz, const char *message);利用指定类的消息(由 message 指定)构造异常对象并抛出该异常。 参数: env:JNI 接口指针。 clazz:java.l
6、ang.Throwable 的子类。 message:用于构造 java.lang.Throwable 对象的消息。 返回值: 成功时返回 0,失败时返回负数。 抛出: 新构造的 java.lang.Throwable 对象。3) ExceptionOccurredjthrowable ExceptionOccurred(JNIEnv *env);确定是否某个异常正被抛出。在平台相关代码调用 ExceptionClear() 或 Java 代码处理该异 常前,异常将始终保持抛出状态。 参数: env:JNI 接口指针。 返回值: 返回正被抛出的异常对象,如果当前无异常被抛出,则返回 NULL。
7、4) ExceptionDescribevoid ExceptionDescribe(JNIEnv *env);将异常及堆栈的回溯输出到系统错误报告信道(例如 stderr) 。该例程可便利调试操作。 参数: env:JNI 接口指针。5) ExceptionClearvoid ExceptionClear(JNIEnv *env);清除当前抛出的任何异常。如果当前无异常,则此例程不产生任何效果。 参数: env:JNI 接口指针。6) FatalErrorvoid FatalError(JNIEnv *env, const char *msg);抛出致命错误并且不希望虚拟机进行修复。该函数无
8、返回值。 参数: env:JNI 接口指针。 msg:错误消息。3.全局及局部引用全局及局部引用1) NewGlobalRefjobject NewGlobalRef(JNIEnv *env, jobject obj);创建 obj 参数所引用对象的新全局引用。obj 参数既可以是全局引用,也可以是局部引用。 全局引用通过调用 DeleteGlobalRef() 来显式撤消。 参数: env:JNI 接口指针。 obj:全局或局部引用。 返回值: 返回全局引用。如果系统内存不足则返回 NULL。2) DeleteGlobalRefvoid DeleteGlobalRef(JNIEnv *env
9、, jobject globalRef);删除 globalRef 所指向的全局引用。参数: env:JNI 接口指针。 globalRef:全局引用。3) DeleteLocalRefvoid DeleteLocalRef(JNIEnv *env, jobject localRef);删除 localRef 所指向的局部引用。 参数: env:JNI 接口指针。 localRef:局部引用。4.对象操作对象操作1) AllocObjectjobject AllocObject(JNIEnv *env, jclass clazz);分配新 Java 对象而不调用该对象的任何构造函数。返回该对象
10、的引用。clazz 参数务必不 要引用数组类。 参数: env:JNI 接口指针。 clazz:Java 类对象。 返回值: 返回 Java 对象。如果无法构造该对象,则返回 NULL。 抛出: InstantiationException:如果该类为一个接口或抽象类。 OutOfMemoryError:如果系统内存不足。2) NewObject、NewObjectA、NewObjectVjobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, .);jobject NewObjectA(JNIEnv *env,jclas
11、s 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()收到这些参数后,将把
12、它们传给编程人员所要调用的 Java 方法。 NewObjectA编程人员应将传递给构造函数的所有参数放在 jvalues 类型的数组 args 中,该数组紧跟着放 在 methodID 参数的后面。NewObject() 收到数组中的这些参数后,将把它们传给编程人员 所要调用的 Java 方法。 NewObjectV编程人员应将传递给构造函数的所有参数放在 va_list 类型的参数 args 中,该参数紧跟着放 在 methodID 参数的后面。NewObject() 收到这些参数后,将把它们传给编程人员所要调用 的 Java 方法。参数: env:JNI 接口指针。 clazz:Java
13、 类对象。 methodID:构造函数的方法 ID。 NewObject 的其它参数: 传给构造函数的参数。 NewObjectA 的其它参数: args:传给构造函数的参数数组。 NewObjectV 的其它参数: args:传给构造函数的参数 va_list。 返回值: 返回 Java 对象,如果无法构造该对象,则返回 NULL。 抛出: InstantiationException:如果该类为接口或抽象类。 OutOfMemoryError:如果系统内存不足。 构造函数抛出的任何异常。3) GetObjectClassjclass GetObjectClass(JNIEnv *env,
14、jobject obj);返回对象的类。 参数: env:JNI 接口指针。 obj:Java 对象(不能为 NULL) 。 返回值: 返回 Java 类对象。4) IsInstanceOfjboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz);测试对象是否为某个类的实例。 参数: env:JNI 接口指针。 obj:Java 对象。 clazz:Java 类对象。 返回值: 如果可将 obj 强制转换为 clazz,则返回 JNI_TRUE。否则返回 JNI_FALSE。NULL 对象可强制 转换为任何类。5) IsSame
15、Objectjboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2);测试两个引用是否引用同一 Java 对象。 参数: env:JNI 接口指针。 ref1:Java 对象。 ref2:Java 对象。 返回值: 如果 ref1 和 ref2 引用同一 Java 对象或均为 NULL,则返回 JNI_TRUE。否则返回JNI_FALSE。5.调用实例方法调用实例方法1) GetMethodIDjmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name,
16、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:如果系统内存不足。2) CallMethod 、CallMethodA、CallMethodVNativeType Ca