zoukankan      html  css  js  c++  java
  • (二)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('')做结束符, 当UTF-8包含非ASCII码字符时,以''做结束符的规则不变。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:域的新值。            

  • 相关阅读:
    谷歌、火狐浏览器下实现JS跨域iframe高度自适应的完美解决方法,跨域调用JS不再是难题!
    23种设计模式大全(适合新手阅读)
    职责链模式-设计模式系列
    策略模式-设计模式系列
    状态模式-设计模式系列
    解释器模式-设计模式系列
    备忘录模式
    中介者模式
    SQL-Server collation, what is it and how to change db/column collation
    [SimHash] the Hash-based Similarity Detection Algorithm
  • 原文地址:https://www.cnblogs.com/maogefff/p/8385411.html
Copyright © 2011-2022 走看看