标签:
在写android NDK的时候常常用到的一些JNI API的总结(参考官方文档:JNI API)
jclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize buf_len);
功能:Loads a class from a buffer of raw class data. The buffer containing the raw class data is not referenced by the VM after the DefineClass call returns, and it may be discarded if desired.
参数:
env JNI 接口指针。
loader 分派给所定义的类的类加载器。
buf 包含 .class 文件数据的缓冲区。
buf_len 缓冲区长度。
jclass FindClass (JNIEnv *env, const char *name);
jclass GetObjectClass (JNIEnv *env, jobject obj);
jclass GetSuperclass (JNIEnv *env, jclass clazz);
功能:获取父类或者说超类 。 如果 clazz 代表类class而非类 object,则该函数返回由 clazz 所指定的类的超类。 如果 clazz 指定类 object 或代表某个接口,则该函数返回NULL。
参数:
env JNI 接口指针。
clazz Java 类对象。
返回值:
由 clazz 所代表的类的超类或 NULL。
jint Throw(JNIEnv *env, jthrowable obj);
参数:
env JNI 接口指针。
obj java.lang.Throwable 对象。
返回值: 成功时返回 0,失败时返回负数。
jint ThrowNew (JNIEnv *env , jclass clazz, const char *message);
参数:
env JNI 接口指针。
clazz java.lang.Throwable 的子类。
message 用于构造java.lang.Throwable对象的消息。
返回值: 成功时返回 0,失败时返回负数。
jthrowable ExceptionOccurred (JNIEnv *env);
功能:确定是否某个异常正被抛出。在平台相关代码调用 ExceptionClear() 或 Java 代码处理该异常前,异常将始终保持抛出状态。
参数: env JNI 接口指针。
void ExceptionDescribe (JNIEnv *env);
void ExceptionClear (JNIEnv *env);
参数: env JNI 接口指针。
void FatalError (JNIEnv *env, const char *msg);
jobject NewGlobalRef (JNIEnv *env, jobject obj);
void DeleteGlobalRef (JNIEnv *env, jobject globalRef);
void DeleteLocalRef (JNIEnv *env, jobject localRef);
jobject AllocObject (JNIEnv *env, jclass clazz);
jobject NewObject (JNIEnv *env , jclass clazz, jmethodID methodID, ...); //参数附加在函数后面
jobject NewObjectA (JNIEnv *env , jclassclazz, jmethodID methodID, jvalue *args); //参数以指针形式附加
jobjec tNewObjectV (JNIEnv *env , jclassclazz, jmethodID methodID, va_list args); //参数以"链表"形式附加
参数:
env JNI 接口指针。
clazz Java 类对象。
methodID 构造函数的方法 ID。
NewObject 的其它参数: 传给构造函数的参数,可以为空 。
NewObjectA 的其它参数: args:传给构造函数的参数数组。
NewObjectV 的其它参数: args:传给构造函数的参数 va_list。
返回值: 返回 Java 对象,如果无法构造该对象,则返回NULL。
jclass GetObjectClass (JNIEnv *env, jobject obj);
jboolean IsInstanceOf (JNIEnv *env, jobject obj, jclass clazz);
参数:
env JNI 接口指针。
obj Java 对象。
clazz Java 类对象。
返回值:如果可将 obj 强制转换为 clazz,则返回 JNI_TRUE。否则返回 JNI_FALSE。NULL 对象可强制转换为任何类。
jbooleanIsSameObject (JNIEnv *env, jobjectref1, jobject ref2);
jstring NewString (JNIEnv *env, const jchar *unicodeChars, jsize len);
jsize GetStringLength (JNIEnv *env, jstring string);
const jchar * GetStringChars (JNIEnv*env, jstring string, jboolean *isCopy);
参数:
env:JNI 接口指针。
string:Java 字符串对象。
isCopy:指向布尔值的指针。
返回值:指向 Unicode 字符串的指针,如果操作失败,则返回NULL。
void ReleaseStringChars (JNIEnv *env, jstring string, const jchar *chars);
jstring NewStringUTF (JNIEnv *env, const char *bytes);
参数:
env:JNI 接口指针。如果无法构造该字符串,则为 NULL。
bytes:指向 UTF-8 字符串的指针。
返回值:Java 字符串对象。如果无法构造该字符串,则为NULL。
jsize GetStringUTFLength (JNIEnv *env, jstring string);
const char* GetStringUTFChars (JNIEnv*env, jstring string, jboolean *isCopy);
参数:
env:JNI 接口指针。
string:Java 字符串对象。
isCopy:指向布尔值的指针。
返回值: 指向 UTF-8 字符串的指针。如果操作失败,则为 NULL。
void ReleaseStringUTFChars (JNIEnv *env, jstring string, const char *utf);
jsize GetArrayLength (JNIEnv *env, jarray array);
jarray NewObjectArray (JNIEnv *env, jsize length, jclass elementClass, jobject initialElement);
参数:
env:JNI 接口指针。
length:数组大小。
elementClass:数组元素类。
initialElement:初始值。 可以为NULL 。
返回值:Java 数组对象。如果无法构造数组,则为 NULL。
说明: 使用该函数时,为了便于易操作性,我们一般可以用jobjectArray数组类型或得返回值,例如:
jobjectArray objArray = env->NewObjectArray ( );
//操作该对象
env->GetObjectArrayElement (objArray, 0);//获得该object数组在索引0处的值 ,(可以强制转换类型).
jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index);
void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject value);
New<PrimitiveType>Array
NativeType New<PrimitiveType>Array (JNIEnv *env, ArrayType array, jboolean*isCopy);
New<PrimitiveType>Array type
NewBooleanArray() jbooleanArray
NewByteArray() jbyteArray
NewCharArray() jcharArray
NewShortArray() jshortArray
NewIntArray() jintArray
NewLongArray() jlongArray
NewFloatArray() jfloatArray
NewDoubleArray() jdoubleArray
Get<PrimitiveType>ArrayElements
NativeType *Get<PrimitiveType>ArrayElements (JNIEnv *env, ArrayType array, jboolean*isCopy);
ReleaseArrayElements()。 如果 isCopy 不是 NULL,*isCopy 在复制完成后即被设为 JNI_TRUE。如果未复制,则设为 JNI_FALSE。
不管布尔数组在 Java 虚拟机中如何表示,GetBooleanArrayElements() 将始终返回一个 jbooleans 类型的指针,其中每一字节代表一个元素(开包表示)。内存中将确保所有其它类型。
Get<PrimitiveType>ArrayElements 例程 数组类型 本地类型
GetBooleanArrayElements() jbooleanArray jboolean
GetByteArrayElements() jbyteArray jbyte
GetCharArrayElements() jcharArray jchar
GetShortArrayElements() jshortArray jshort
GetIntArrayElements() jintArray jint
GetLongArrayElements() jlongArray jlong
GetFloatArrayElements() jfloatArray jfloat
GetDoubleArrayElements() jdoubleArray jdouble
Release<PrimitiveType>ArrayElements 方法类型
void Release<PrimitiveType>ArrayElements (JNIEnv *env, ArrayType array, NativeType *elems,jint mode);
模式 动作
0 复制回内容并释放elems 缓冲区
JNI_COMMIT 复制回内容但不释放elems 缓冲区
JNI_ABORT 释放缓冲区但不复制回变化
多数情况下,编程人员将把“0”传给 mode 参数以确保固定的数组和复制的数组保持一致。其它选项可以使编程人员进一步控制内存管理,但使用时务必慎重。
使用说明:
将 ArrayType 替换为对应的数组类型。
将 NativeType 替换为该例程对应的本地类型。
参数: env:JNI 接口指针。
array:Java 数组对象。
elems:指向数组元素的指针。
mode:释放模式。
Release<PrimitiveType>ArrayElements 方法组 数组类型 本地类型
ReleaseBooleanArrayElements() jbooleanArray jboolean
ReleaseByteArrayElements() jbyteArray jbyte
ReleaseCharArrayElements() jcharArray jchar
ReleaseShortArrayElements() jshortArray jshort
ReleaseIntArrayElements() jintArray jint
ReleaseLongArrayElements() jlongArray jlong
ReleaseFloatArrayElements() jfloatArray jfloat
ReleaseDoubleArrayElements() jdoubleArray jdouble
Get<PrimitiveType>ArrayRegion 方法类型
void Get<PrimitiveType>ArrayRegion (JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);
方法族如下:
Get<PrimitiveType>ArrayRegion方法 数组类型 本地类型
GetBooleanArrayRegion() jbooleanArray jboolean
GetByteArrayRegion() jbyteArray jbyte
GetCharArrayRegion() jcharArray jchar
GetShortArrayRegion() jshortArray jhort
GetIntArrayRegion() jintArray jint
GetLongArrayRegion() jlongArray jlong
GetFloatArrayRegion() jfloatArray jloat
GetDoubleArrayRegion() jdoubleArray jdouble
Set<PrimitiveType>ArrayRegion 方法类型
void Set<PrimitiveType>ArrayRegion (JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);
Set<PrimitiveType>ArrayRegion 数组类型 本地类型
SetBooleanArrayRegion() jbooleanArray jboolean
SetByteArrayRegion() jbyteArray jbyte
SetCharArrayRegion() jcharArray jchar
SetShortArrayRegion() jshortArray jshort
SetIntArrayRegion() jintArray jint
SetLongArrayRegion() jlongArray jlong
SetFloatArrayRegion() jfloatArray jfloat
SetDoubleArrayRegion() jdoubleArray jdouble
jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig);
参数:
env:JNI 接口指针。
clazz:Java 类对象。
name: 该属性的Name名称
sig: 该属性的域签名。
返回值:属性ID。如果操作失败,则返回NULL。
NativeType Get<type>Field (JNIEnv*env, jobject obj, jfieldID fieldID);
Get<type>Field 例程名 本地类型
GetObjectField() jobject
GetBooleanField() jboolean
GetByteField() jbyte
GetCharField() jchar
GetShortField() jshort
GetIntField() jint
GetLongField() jlong
GetFloatField() jfloat
GetDoubleField() jdouble
Set<type>Field 方法族
void Set<type>Field (JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value);
方法族 如下:
Set<type>Field 方法族 本地类型
SetObjectField() jobject
SetBooleanField() jboolean
SetByteField() jbyte
SetCharField() jchar
SetShortField() jshort
SetIntField() jint
SetLongField() jlong
SetFloatField() jfloat
SetDoubleField() jdouble
jfieldID GetStaticFieldID (JNIEnv *env,jclass clazz, const char *name, const char *sig);
NativeType GetStatic<type>Field (JNIEnv*env,jclass classzz , jfieldID fieldID);
void SetStatic<type>Field (JNIEnv *env,jclassclasszz, jfieldID fieldID, NativeType value);
jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
功能:返回类或接口实例(非静态)方法的方法 ID。方法可在某个 clazz 的超类中定义,也可从 clazz 继承。该方法由其名称和签名决定。 GetMethodID() 可使未初始化的类初始化。要获得构造函数的方法 ID,应将 作为方法名,同时将 void (V) 作为返回类型。
参数:
env:JNI 接口指针。
clazz:Java 类对象。
name:方法名。
sig:方法的签名。
返回值: 方法 ID,如果找不到指定的方法,则为 NULL。
Call<type>Method 例程 、Call<type>MethodA 例程 、Call<type>MethodV 例程
NativeType Call<type>Method (JNIEnv*en v, 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 实例方法。它们的差别仅在于向其所调用的方法传递参数时所用的机制。 这三个操作将根据所指定的方法 ID 调用 Java 对象的实例(非静态)方法。参数 methodID 必须通过调用 GetMethodID() 来获得。当这些函数用于调用私有方法和构造函数时,方法 ID 必须从obj 的真实类派生而来,而不应从其某个超类派生。当然,附加参数可以为空 。
参数:
env:JNI 接口指针。
obj:Java 对象。
methodID:方法 ID。
返回值: 返回调用 Java 方法的结果。
下表根据结果类型说明了各个方法类型。用户应将CallMethod 中的 type 替换为所调用方法的Java 类型(或使用表中的实际方法名),同时将 NativeType 替换为该方法相应的本地类型。省略掉了其他两种类型。
“`
Java层返回值 方法族 本地返回类型NativeType
返回值为void : CallVoidMethod() A/V (无)
返回值为引用类型: CallObjectMethod() jobect
返回值为boolean : CallBooleanMethod () jboolean
返回值为byte : CallByteMethod() jbyte
返回值为char : CallCharMethod() jchar
返回值为short CallShortMethod() jshort
返回值为int : CallIntMethod() jint
返回值为long: CallLongMethod() jlong
返回值为float : CallFloatMethod() jfloat
返回值为double: CallDoubleMethod() jdouble
#### 4.调用静态方法
jfieldID GetStaticMethodID (JNIEnv *env,jclass clazz, const char *name, const char *sig);
NativeType CallMethod (JNIEnv*env,jclass classzz , jfieldID fieldID);
## 注册本地方法
jint RegisterNatives (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,jint nMethods);
* 功能:向 clazz 参数指定的类注册本地方法。methods 参数将指定 JNINativeMethod 结构的数组,其中包含本地方法的名称、签名和函数指针。nMethods 参数将指定数组中的本地方法数。JNINativeMethod 结构定义如下所示:
typedef struct {
char *name;
char *signature;
void *fnPtr;
} JNINativeMethod;
函数指针通常必须有下列签名:
ReturnType (*fnPtr)(JNIEnv *env, jobject objectOrClass, …);
* 参数:
env:JNI 接口指针。
clazz:Java 类对象。
methods:类中本地方法和具体实现方法的映射指针。
nMethods:类中的本地方法数。
* 返回值: 成功时返回 "0";失败时返回负数。
* 抛出: NoSuchMethodError:如果找不到指定的方法或方法不是本地方法。
jint UnregisterNatives (JNIEnv *env, jclass clazz);
“`
* 功能:
取消注册类的本地方法。类将返回到链接或注册了本地方法函数前的状态.该函数不应在常规平台相关代码中使用。相反,它可以为某些程序提供一种重新加载和重新链接本地库的途径。
* 参数:
env:JNI 接口指针。
clazz:Java 类对象。
* 返回值: 成功时返回“0”;失败时返回负数。
标签:
原文地址:http://blog.csdn.net/qzs_kaka/article/details/51332242