(二)JNI方法总结

整个网上就没看到一个关于JNI好点的文档,干脆自己写一份,以方便以后使用的时候查阅

1. 类操作   

DefineClass    

jclass  DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);          

从原始类数据的缓冲区中加载类。          

 

参数:          

env:JNI 接口指针。        

loader:分派给所定义的类的类加载器。       

buf:包含 .class 文件数据的缓冲区。           

bufLen:缓冲区长度。      

返回值:             

返回 Java 类对象。如果出错则返回NULL。        

抛出:          

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

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

OutOfMemoryError:如果系统内存不足。           

             

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。          

             

IsAssignableFrom    

jboolean  IsAssignableFrom(JNIEnv *env, jclass clazz1, jclass clazz2);        

确定 clazz1 的对象是否可安全地强制转换为clazz2。        

 

参数:          

env:JNI 接口指针。        

clazz1:第一个类参数。           

clazz2:第二个类参数。           

返回值:             

下列某个情况为真时返回 JNI_TRUE:            

             

第一及第二个类参数引用同一个 Java 类。          

第一个类是第二个类的子类。          

第二个类是第一个类的某个接口。          

             

2. 异常   

Throw       

jint Throw(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:错误消息。       

             

3. 全局及局部引用      

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:局部引用。         

             

4. 实例化对象的操作   

AllocObject    

jobject  AllocObject(JNIEnv *env, jclass clazz); 

分配新Java对象而不调用该对象的任何构造函数。返回该对象的引用。       

clazz 参数务必不要引用数组类。           

 

参数:          

env:JNI 接口指针。        

clazz:Java 类对象。        

返回值:             

返回 Java 对象。如果无法构造该对象,则返回NULL。            

抛出:          

InstantiationException:如果该类为一个接口或抽象类。            

OutOfMemoryError:如果系统内存不足。           

             

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

clazz参数务必不要引用数组类。    

三个函数的区别在于,调用构造函数时传递参数的方法不同。NewObject是直接放在methodID后面,NewObjectA是放在args的数组里面,NewObjectV是放在参数为va_list的args里面,其他都一样。

        

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 类对象。          

             

IsInstanceOf   

jboolean  IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz);       

测试对象是否为某个类的实例。             

 

参数:          

env:JNI 接口指针。        

obj:Java 对象。       

clazz:Java 类对象。        

返回值:             

如果可将 obj 强制转换为 clazz,则返回 JNI_TRUE。否则返回 JNI_FALSE。NULL 对象可强制转换为任何类。             

             

IsSameObject     

jboolean  IsSameObject(JNIEnv *env, jobject ref1, jobject ref2);         

测试两个引用是否引用同一 Java 对象。       

 

参数:          

env:JNI 接口指针。        

ref1:Java 对象。      

ref2:Java 对象。      

返回值:             

如果 ref1 和 ref2 引用同一 Java 对象或均为 NULL,则返回 JNI_TRUE。否则返回 JNI_FALSE。            

             

5. 调用实例化对象里的方法      

GetMethodID     

jmethodID  GetMethodID(JNIEnv *env, jclass clazz,  const char *name, const char *sig);          

返回类或接口实例(非静态)方法的方法 ID。方法可在某个 clazz 的超类中定义,也可从 clazz 继承。该方法由其名称和签名决定。             

GetMethodID() 可使未初始化的类初始化。          

要获得构造函数的方法 ID,应将 <init> 作为方法名,签名:如果无参:"()V"。   如果带一个整型参数:"()I"

        

 

参数:          

env:JNI 接口指针。        

clazz:Java 类对象。        

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

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

返回值:             

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

抛出:          

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

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

OutOfMemoryError:如果系统内存不足。           

             

Call< type >Method、Call< type >MethodA、Call< type >MethodV

NativeType   Call<type>Method(JNIEnv*env, 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 的真实类派生而来,而不应从其某个超类派生。             

Call<type>Method例程            

编程人员应将要传给方法的所有参数紧跟着放在 methodID 参数之后。Call<type>Method 例程接受这些参数并将其传给编程人员所要调用的 Java 方法。          

Call<type>MethodA 例程         

编程人员应将要传给方法的所有参数放在紧跟在 methodID 参数之后的 jvalues 类型数组 args 中。Call<type>MethodA routine 接受这些数组中的参数并将其传给编程人员所要调用的 Java 方法。           

Call<type>MethodV例程          

编程人员将方法的所有参数放在紧跟着在 methodID 参数之后的 va_list 类型参数变量中。Call<type>MethodV routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。        

下表根据结果类型说明了各个方法调用例程。用户应将Call<type>Method 中的 type 替换为所调用方法的 Java 类型(或使用表中的实际方法调用例程名),同时将 NativeType 替换为该例程相应的本地类型。       

表 4-3 实例方法调用例程

 

参数:          

env:JNI 接口指针。        

obj:Java 对象。       

methodID:方法 ID。       

Call<type>Method例程的其它参数:            

要传给 Java 方法的参数。       

Call<type>MethodA例程的其它参数:          

args:参数数组。       

Call<type>MethodV例程的其它参数:          

args:参数的 va_list。       

返回值:             

返回调用 Java 方法的结果。          

抛出:          

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

             

6. 字符串操作   

JNI支持Unicode/UTF-8字符编码互转。Unicode以16-bits值编码;UTF-8是一种以字节为单位变长格式的字符编码,并与7-bitsASCII码兼容。UTF-8字串与C字串一样,以NULL('\0')做结束符, 当UTF-8包含非ASCII码字符时,以'\0'做结束符的规则不变。7-bit ASCII字符的取值范围在1-127之间,这些字符的值域与UTF-8中相同。当最高位被设置时,表示多字节编码。

 

NewString(Unicode编码)

jstring   NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);       

利用 Unicode 字符数组构造新的 java.lang.String 对象。    

   

参数:          

env:JNI 接口指针。        

unicodeChars:指向 Unicode 字符串的指针。            

len:Unicode 字符串的长度。        

返回值:             

Java 字符串对象。如果无法构造该字符串,则为 NULL。         

抛出:          

OutOfMemoryError:如果系统内存不足。           

             

GetStringLength      

jsize   GetStringLength(JNIEnv *env, jstring string);          

返回 Java 字符串的长度(Unicode 字符数)。

 

参数:          

env:JNI 接口指针。        

string:Java 字符串对象。       

返回值:             

Java 字符串的长度。         

             

GetStringChars   

const   jchar *   GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);  

返回指向字符串的 Unicode 字符数组的指针。该指针在调用 ReleaseStringchars() 前一直有效。             

如果 isCopy 非空,则在复制完成后将 *isCopy 设为 JNI_TRUE。如果没有复制,则设为JNI_FALSE。  

 

参数:          

env:JNI 接口指针。        

string:Java 字符串对象。       

isCopy:指向布尔值的指针。          

返回值:             

指向 Unicode 字符串的指针,如果操作失败,则返回NULL。         

             

ReleaseStringChars      

void    ReleaseStringChars(JNIEnv *env, jstring string, const jchar *chars); 

通知虚拟机平台相关代码无需再访问 chars。参数 chars 是一个指针,可通过 GetStringChars() 从 string 获得。

       

参数:          

env:JNI 接口指针。        

string:Java 字符串对象。       

chars:指向 Unicode 字符串的指针。          

 

NewStringUTF(UTF-8编码)

jstring   NewStringUTF(JNIEnv *env, const char *bytes);             

利用 UTF-8 字符数组构造新 java.lang.String 对象。         

 

参数:          

env:JNI 接口指针。如果无法构造该字符串,则为 NULL。            

bytes:指向 UTF-8 字符串的指针。      

返回值:             

Java 字符串对象。如果无法构造该字符串,则为 NULL。         

抛出:          

OutOfMemoryError:如果系统内存不足。           

             

GetStringUTFLength     

jsize   GetStringUTFLength(JNIEnv *env, jstring string);       

以字节为单位返回字符串的 UTF-8 长度。           

 

参数:          

env:JNI 接口指针。        

string:Java 字符串对象。       

返回值:             

返回字符串的 UTF-8 长度。           

             

GetStringUTFChars      

const  char*  GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);       

返回指向字符串的 UTF-8 字符数组的指针。该数组在被ReleaseStringUTFChars() 释放前将一直有效。          

如果 isCopy 不是 NULL,*isCopy 在复制完成后即被设为 JNI_TRUE。如果未复制,则设为 JNI_FALSE。       

 

参数:          

env:JNI 接口指针。        

string:Java 字符串对象。       

isCopy:指向布尔值的指针。          

返回值:             

指向 UTF-8 字符串的指针。如果操作失败,则为 NULL。        

             

ReleaseStringUTFChars     

void    ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);          

通知虚拟机平台相关代码无需再访问 utf。utf 参数是一个指针,可利用 GetStringUTFChars() 从 string 获得。            

 

参数:          

env:JNI 接口指针。        

string:Java 字符串对象。       

utf:指向 UTF-8 字符串的指针。          

             

7. 数组操作(基本类型数组、对象类型数组)

GetArrayLength

 

jsize  GetArrayLength(JNIEnv *env, jarray array);          

返回数组中的元素数。             

 

参数:          

env:JNI 接口指针。        

array:Java 数组对象。            

返回值:             

数组的长度。             

 

下面是对象类型数组(String之类的):

NewObjectArray

jarray  NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement);            

构造新的数组,它将保存类 elementClass 中的对象。所有元素初始值均设为 initialElement。          

 

参数:          

env:JNI 接口指针。        

length:数组大小。           

elementClass:数组元素类。           

initialElement:初始值。           

返回值:             

Java 数组对象。如果无法构造数组,则为 NULL。             

抛出:          

OutOfMemoryError:如果系统内存不足。           

             

GetObjectArrayElement

jobject  GetObjectArrayElement(JNIEnv *env,  jobjectArray array, jsize index);          

返回 Object 数组的元素。       

 

参数:          

env:JNI 接口指针。        

array:Java 数组。            

index:数组下标。            

返回值:             

Java 对象。         

抛出:          

ArrayIndexOutOfBoundsException:如果 index 不是数组中的有效下标。      

             

SetObjectArrayElement

void  SetObjectArrayElement(JNIEnv *env, jobjectArray array,  jsize index, jobject value); 

设置 Object 数组的元素。       

 

参数:          

env:JNI 接口指针。        

array:Java 数组。            

index:数组下标。            

value:新值。            

抛出:          

ArrayIndexOutOfBoundsException:如果 index 不是数组中的有效下标。      

ArrayStoreException:如果 value 的类不是数组元素类的子类。      

 

下面是基本类型数组(jchar/jint之类的):

New< PrimitiveType >Array

ArrayType  New<PrimitiveType>Array(JNIEnv*env, jsize length);         

用于构造新基本类型数组对象的一系列操作。表 4-8 说明了特定的基本类型数组构造函数。用户应把New<PrimitiveType>Array 替换为某个实际的基本类型数组构造函数例程名(见下表),然后将 ArrayType替换为该例程相应的数组类型。

 表 4-8 New<PrimitiveType>Array 数组构造函数系列 

 

参数:          

env:JNI 接口指针。        

length:数组长度。           

返回值:             

Java 数组。如果无法构造该数组,则为 NULL。         

             

Get< PrimitiveType >ArrayElements:(拿到数组:jintArray-->jint*)

NativeType  *Get<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, jboolean*isCopy);          

一组返回基本类型数组体的函数。结果在调用相应的 Release<PrimitiveType>ArrayElements()函数前将一直有效。由于返回的数组可能是 Java 数组的副本,因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了Release<PrimitiveType>ArrayElements()。             

如果 isCopy 不是 NULL,*isCopy 在复制完成后即被设为 JNI_TRUE。如果未复制,则设为 JNI_FALSE。       

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

             

将 Get<PrimitiveType>ArrayElements 替换为表中某个实际的基本类型元素访问器例程名。       

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

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

             

不管布尔数组在 Java 虚拟机中如何表示,GetBooleanArrayElements() 将始终返回一个 jbooleans 类型的指针,其中每一字节代表一个元素(开包表示)。内存中将确保所有其它类型的数组为连续的。           

 表4-9 Get<PrimitiveType>ArrayElements 访问器例程系列

 

参数:          

env:JNI 接口指针。        

array:Java 字符串对象。        

isCopy:指向布尔值的指针。          

返回值:             

返回指向数组元素的指针,如果操作失败,则为 NULL。          

             

Release< PrimitiveType >ArrayElements

void   Release<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, NativeType *elems, jintmode);             

通知虚拟机平台相关代码无需再访问 elems 的一组函数。elems 参数是一个通过使用对应的Get<PrimitiveType>ArrayElements() 函数由 array 导出的指针。必要时,该函数将把对 elems 的修改复制回基本类型数组。             

mode参数将提供有关如何释放数组缓冲区的信息。如果elems 不是 array 中数组元素的副本,mode将无效。否则,mode 将具有下表所述的功能:

 

表 4-10 基本类型数组释放模式

    

多数情况下,编程人员将把“0”传给 mode 参数以确保固定的数组和复制的数组保持一致。其它选项可以使编程人员进一步控制内存管理,但使用时务必慎重。          

下表说明了构成基本类型数组撤消程序系列的特定例程。应进行如下替换;          

             

将 Release<PrimitiveType>ArrayElements 替换为表 4-11 中的某个实际基本类型数组撤消程序例程名。

      

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

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

   

 表 4-11 Release<PrimitiveType>ArrayElements 数组例程系列

 

参数:          

env:JNI 接口指针。        

array:Java 数组对象。            

elems:指向数组元素的指针。        

mode:释放模式。           

             

Get< PrimitiveType >ArrayRegion

void    Get<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);       

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

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

             

将 Get<PrimitiveType>ArrayRegion 替换为表 4-12 中的某个实际基本类型元素访问器例程名。

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

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

 表 4-12 Get<PrimitiveType>ArrayRegion 数组访问器例程系列

 

参数:          

env:JNI 接口指针。        

array:Java 指针。            

start:起始下标。       

len:要复制的元素数。            

buf:目的缓冲区。            

抛出:          

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

             

Set< PrimitiveType >ArrayRegion

void   Set<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,  jsize start, jsize len, NativeType *buf);       

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

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

             

将 Set<PrimitiveType>ArrayRegion 替换为表中的实际基本类型元素访问器例程名。          

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

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

 

 表 4-13 Set<PrimitiveType>ArrayRegion 数组访问器例程系列

参数:          

env:JNI 接口指针。        

array:  Java 数组。           

start:起始下标。       

len:要复制的元素数。            

buf:源缓冲区。        

抛出:          

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

             

8. 注册本地方法      

RegisterNatives   

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:如果找不到指定的方法或方法不是本地方法。       

             

UnregisterNatives    

jint   UnregisterNatives(JNIEnv *env, jclass clazz);      

取消注册类的本地方法。类将返回到链接或注册了本地方法函数前的状态。          

该函数不应在常规平台相关代码中使用。相反,它可以为某些程序提供一种重新加载和重新链接本地库的途径。     

     

参数:          

env:JNI 接口指针。        

clazz:Java 类对象。        

返回值:             

成功时返回“0”;失败时返回负数。         

             

9. 访问对象的域(也就是查看修改对象里面的属性,或者说变量)

GetFieldID     

jfieldID   GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);      

返回类的实例(非静态)域的域 ID。该域由其名称及签名指定。访问器函数的Get<type>Field 及 Set<type>Field 系列使用域 ID 检索对象域。      

GetFieldID() 将未初始化的类初始化。           

GetFieldID() 不能用于获取数组的长度域。应使用GetArrayLength()。       

     

参数:          

env:JNI 接口指针。        

clazz:Java 类对象。        

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

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

返回值:             

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

抛出:          

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

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

OutOfMemoryError:如果系统内存不足。           

             

Get< type >Field     

NativeType   Get<type>Field(JNIEnv*env, jobject obj, jfieldID fieldID);             

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

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

 表 4-1 Get<type>Field 访问器例程系列

 

参数:          

env:JNI 接口指针。        

obj:Java 对象(不能为 NULL)。         

fieldID:有效的域 ID。            

返回值:             

域的内容。          

             

Set< type >Field

void   Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value);       

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

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

       

 表4-2 Set<type>Field 访问器例程系列

参数:          

env:JNI 接口指针。        

obj:Java 对象(不能为 NULL)。         

fieldID:有效的域 ID。            

value:域的新值。            

 

posted on 2018-03-28 10:33  maogefff  阅读(452)  评论(0编辑  收藏  举报

导航