JNI常用函数(转)

要素  :1、 该函数大全是基于C语言方式的,对于C++方式可以直接转换 ,例如,对于生成一个jstring类型的方法转换分别如下:

                     C编程环境中使用方法为:(*env) ->NewStringUTF(env , "123") ;

                    C++编程环境中(例如,VC下)则是: env ->NewStringUTF( "123") ;             (使用起来更简单)

 

           2、关于下列有些函数中:*isCopy     的说明,例如,如下函数:                     

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

 

        对第三个参数 jboolean *isCopy说明如下:

             当从JNI函数GetStringUTFChars函数中返回得到字符串B时,如果B是原始字符串java.lang.String的一份拷贝,

      则isCopy  被赋值为JNI_TRUE。如果B是和原始字符串指向的是JVM中的同一份数据,则isCopy  被赋值为JNI_FALSE。

     当isCopy  为JNI_FALSE时,本地代码绝不能修改字符串的内容,否则JVM中的原始字符串也会被修改,这会打破Java语言

      中字符串不可变的规则。

            通常,我们不必关心JVM是否会返回原始字符串的拷贝,只需要为isCopy传递NULL作为参数 。

                                                                                                           ----     以上内容来自 《JNI编程指南》

 

一、类操作             

                            

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

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

     参数: env        JNI 接口指针。            

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

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

                 bufLen  缓冲区长度。          

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

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

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

                       OutOfMemoryError  如果系统内存不足。                  

                        

   jclass FindClass (JNIEnv *env, const char *name);                

     功能: 该函数用于加载本地定义的类。它将搜索由CLASSPATH 环境变量为具有指定名称的类所指定的目录和 zip文件。            

     参数:env    JNI 接口指针。            

              name  类全名(即包名后跟类名,之间由"/"分隔).如果该名称以“[(数组签名字符)打头,则返回一个数组类。         

     返回值:返回类对象全名。如果找不到该类,则返回 NULL。               

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

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

                  NoClassDefFoundError  如果找不到所请求的类或接口的定义。            

                  OutOfMemoryError       如果系统内存不足。                  

 

  jclass GetObjectClass (JNIEnv *env, jobject obj); 

     功能:通过对象获取这个类。该函数比较简单,唯一注意的是对象不能为NULL,否则获取的class肯定返回也为NULL。     

     参数:  env   JNI 接口指针。            

                obj   Java 类对象实例。         

   

 

  jclass GetSuperclass (JNIEnv *env, jclass clazz);          

     功能:获取父类或者说超类 。 如果 clazz 代表类class而非类 object,则该函数返回由 clazz 所指定的类的超类。 如果 clazz 

           指定类 object 或代表某个接口,则该函数返回NULL。           

     参数:  env   JNI 接口指针。            

                clazz  Java 类对象。            

     返回值:    由 clazz 所代表的类的超类或 NULL。               

                          

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

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

    参数:  env  JNI 接口指针。            

              clazz1 第一个类参数。               

              clazz2 第二个类参数。               

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

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

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

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

 

   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

         

二、异常操作                  

                        

  jint  Throw(JNIEnv *env, jthrowable obj);         

      功能:抛出 java.lang.Throwable 对象。                 

       参数: env  JNI 接口指针。            

                 obj   java.lang.Throwable 对象。         

       返回值:  成功时返回 0,失败时返回负数。             

       抛出:    java.lang.Throwable 对象 obj。           

                

  jint ThrowNew (JNIEnv *env ,  jclass clazz,  const char *message);            

     功能:利用指定类的消息(由 message 指定)构造异常对象并抛出该异常。               

     参数: env    JNI 接口指针。            

                clazz  java.lang.Throwable 的子类。          

                message  用于构造java.lang.Throwable对象的消息。           

     返回值: 成功时返回 0,失败时返回负数。             

     抛出:  新构造的 java.lang.Throwable 对象。                 

                   

  jthrowable ExceptionOccurred (JNIEnv *env);              

    功能:确定是否某个异常正被抛出。在平台相关代码调用 ExceptionClear() 或 Java 代码处理该异常前,异常将始终保持

        抛出状态。                  

    参数:  env  JNI 接口指针。            

    返回值: 返回正被抛出的异常对象,如果当前无异常被抛出,则返回NULL。           

                      

 void ExceptionDescribe (JNIEnv *env);         

    功能:将异常及堆栈的回溯输出到系统错误报告信道(例如 stderr)。该例程可便利调试操作。               

    参数:env   JNI 接口指针。            

                    

  void ExceptionClear (JNIEnv *env);                

   功能:清除当前抛出的任何异常。如果当前无异常,则此例程不产生任何效果。                  

   参数: env   JNI 接口指针。            

                  

  void FatalError (JNIEnv *env, const char *msg);           

   功能:抛出致命错误并且不希望虚拟机进行修复。该函数无返回值。             

   参数:  env   JNI 接口指针。            

               msg   错误消息。          

             

   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

     

 

三、全局及局部引用             

                      

   jobject NewGlobalRef (JNIEnv *env, jobject obj);         

     功能:创建 obj 参数所引用对象的新全局引用。obj 参数既可以是全局引用,也可以是局部引用。全局引用通过调用 

          DeleteGlobalRef() 来显式撤消。          

     参数:env   JNI 接口指针。            

                obj    全局或局部引用。                 

     返回值: 返回全局引用。如果系统内存不足则返回 NULL。          

                      

  void DeleteGlobalRef (JNIEnv *env, jobject globalRef);                 

     功能: 删除 globalRef 所指向的全局引用。         

     参数: env    JNI 接口指针。            

                globalRef  全局引用。         

                              

  void  DeleteLocalRef (JNIEnv *env, jobject localRef);          

     功能: 删除 localRef所指向的局部引用。             

     参数: env   JNI 接口指针。            

                 localRef  局部引用。            

             

   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    

 

四、对象操作          

          

  jobject AllocObject (JNIEnv *env, jclass clazz);              

     功能:分配新 Java 对象而不调用该对象的任何构造函数。返回该对象的引用。clazz 参数务必不要引用数组类。               

     参数: env  JNI 接口指针。            

               clazz  Java 类对象。            

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

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

                OutOfMemoryError:如果系统内存不足。                  

                        

  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);    //参数以"链表"形式附加            

 

  功能:构造新 Java 对象。方法 ID指示应调用的构造函数方法。注意:该 ID特指该类class的构造函数ID , 必须通过调用 

      GetMethodID() 获得,且调用时的方法名必须为 <init>,而返回类型必须为 void (V)。clazz参数务必不要引用数组类。 

  参数:  env  JNI 接口指针。            

              clazz  Java 类对象。            

              methodID 构造函数的方法 ID。               

     NewObject 的其它参数:  传给构造函数的参数,可以为空 。                  

     NewObjectA 的其它参数: args:传给构造函数的参数数组。              

     NewObjectV 的其它参数: args:传给构造函数的参数 va_list。       

           

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

  抛出:   InstantiationException  如果该类为接口或抽象类。                 

              OutOfMemoryError   如果系统内存不足。                  

              构造函数抛出的任何异常。                  

                               

  jclass GetObjectClass (JNIEnv *env, jobject obj);         

   功能:返回对象的类。             

   参数: env  JNI 接口指针。            

              obj  Java 对象(不能为 NULL)。               

   返回值: 返回 Java 类对象。              

                          

 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);            

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

    参数:  env  JNI 接口指针。            

               ref1  Java 对象。                  

               ref2   Java 对象。                  

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

        

   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    

                  

五、 字符串操作             

                                 

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

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

    参数:   env:JNI 接口指针。            

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

                 len:Unicode 字符串的长度。             

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

    抛出: OutOfMemoryError:如果系统内存不足。                  

                              

 jsize  GetStringLength (JNIEnv *env, jstring string);            

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

    参数:  env:JNI 接口指针。            

                string:Java 字符串对象。          

    返回值: Java 字符串的长度。            

                              

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

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

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

   参数:   env:JNI 接口指针。            

                string:Java 字符串对象。          

                isCopy:指向布尔值的指针。               

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

                                    

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

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

   参数: env:JNI 接口指针。            

              string:Java 字符串对象。          

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

                        

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

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

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

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

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

   抛出:  OutOfMemoryError:如果系统内存不足。                  

                            

 jsize  GetStringUTFLength (JNIEnv *env, jstring string);              

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

   参数:   env:JNI 接口指针。            

               string:Java 字符串对象。          

   返回值:  返回字符串的 UTF-8

 

 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。             

                            

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

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

   参数:   env:JNI 接口指针。            

               string:Java 字符串对象。          

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

 

 

   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

         

六、数组操作                          

 

 jsize GetArrayLength (JNIEnv *env, jarray array);                 

   功能:返回数组中的元素数。                  

   参数:  env:JNI 接口指针。            

              array:Java 数组对象。                

   返回值: 数组的长度。                  

                             

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

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

   参数: env:JNI 接口指针。            

             length:数组大小。               

             elementClass:数组元素类。               

             initialElement:初始值。    可以为NULL 。           

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

   抛出:  OutOfMemoryError:如果系统内存不足。                  

   

   说明: 使用该函数时,为了便于易操作性,我们一般可以用jobjectArray数组类型或得返回值,例如:

                 jobjectArray objArray = env->NewObjectArray ( );

                 //操作该对象

                 env->GetObjectArrayElement (objArray, 0);//获得该object数组在索引0处的值 ,(可以强制转换类型).

 

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

   功能:返回 Object 数组的元素。          

   参数:   env:JNI 接口指针。            

                array:Java 数组。                

                index:数组下标。                 

   返回值: Java 对象。            

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

                  

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

   功能:设置 Object 数组的元素。          

   参数:  env:JNI 接口指针。            

              array:Java 数组。                

               index:数组下标。                 

               value:新值。                 

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

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

                      

 

    New<PrimitiveType>Array方法类型      

         

  NativeType New<PrimitiveType>Array (JNIEnv *env, ArrayType array, jboolean*isCopy);                  

 

     说明: 用于构造新基本类型数组对象的一系列操作。下表说明了特定的基本类型数组构造函数。用户应把

    New<PrimitiveType>Array 替换为某个实际的基本类型数组构造函数例程名(见下表),然后将 ArrayType替换为

 该例程相应的数组类型。

     参数:  env : JNI 接口指针。            

                 length:数组长度。               

     返回值:  Java 数组。如果无法构造该数组,则为 NULL。

            

            New<PrimitiveType>Array 方法组               数组类型        

                  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);                  

   说明:一组返回基本类型数组体的函数。结果在调用相应的 Release<PrimitiveType>ArrayElements()函数前将一直有效。

     由于返回的数组可能是 Java 数组的副本,因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了

     Release<PrimitiveType>ArrayElements()。 如果 isCopy 不是 NULL,*isCopy 在复制完成后即被设为 JNI_TRUE。如果

     未复制,则设为 JNI_FALSE。          

    使用说明:   

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

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

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

    参数:   env:JNI 接口指针。            

                array:Java 字符串对象。           

                isCopy:指向布尔值的指针。               

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

             

     不管布尔数组在 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);            

     功能:通知虚拟机平台相关代码无需再访问 elems 的一组函数。elems 参数是一个通过使用对应的

        Get<PrimitiveType>ArrayElements() 函数由 array 导出的指针。必要时,该函数将把对 elems 的修改复制回基本

        类型数组。mode参数将提供有关如何释放数组缓冲区的信息。如果elems 不是 array 中数组元素的副本,mode将无效。

        否则,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 替换为下表的某个实际基本类型元素访问器例程名。

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

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

   参数:     env:JNI 接口指针。            

                 array:Java 指针。                

                 start:起始下标。                  

                 len:要复制的元素数。                 

                 buf:目的缓冲区。                

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

          

   方法族如下:                             

                    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 替换为表中的实际基本类型元素访问器例程名。          

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

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

    参数: env:JNI 接口指针。            

              array: Java 数组。              

              start:起始下标。                  

              len:要复制的元素数。                 

              buf:源缓冲区。            

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

        

                  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

       

   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

 

 六、访问对象的属性和方法                  

   

1、实例属性的访问

                           

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

   功能:返回类的实例(非静态)域的属性 ID。该域由其名称及签名指定。访问器函数的Get<type>Field 及 Set<type>Field

        系列使用域 ID 检索对象域。GetFieldID() 不能用于获取数组的长度域。应使用GetArrayLength()。          

   参数:  env:JNI 接口指针。            

               clazz:Java 类对象。            

               name: 该属性的Name名称                

               sig:   该属性的域签名。               

   返回值:属性ID。如果操作失败,则返回NULL。              

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

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

              OutOfMemoryError:如果系统内存不足。                 

               

   Get<type>Field 例程               

 

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

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

    参数:   env:JNI 接口指针。            

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

                 fieldID:有效的域 ID。                 

    返回值:   属性的内容。      

 

          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);           

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

 

   参数:  env:JNI 接口指针。            

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

              fieldID:有效的域 ID。                 

              value:域的新值。   

      方法族 如下:                      

               Set<type>Field 方法族            本地类型        

                  SetObjectField()                    jobject     

                  SetBooleanField()                  jboolean  

                  SetByteField()                       jbyte        

                  SetCharField()                      jchar        

                  SetShortField()                     jshort       

                  SetIntField()                         jint  

                  SetLongField()                      jlong         

                  SetFloatField()                      jfloat        

                  SetDoubleField()                  jdouble    

 

 2、静态属性的访问 :也存在相同的方法,

 

        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);           

   

   它们与实例属性的唯一区别在于第二个参数jclass classzz代表的是类引用,而不是类实例。

        

 3、调用实例方法 

      

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

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

         和签名决定。 GetMethodID() 可使未初始化的类初始化。要获得构造函数的方法 ID,应将 <init> 作为方法名,同时将 

         void (V) 作为返回类型。          

    参数:  env:JNI 接口指针。            

                clazz:Java 类对象。            

                name:方法名。          

                sig:方法的签名。           

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

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

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

                  OutOfMemoryError:如果系统内存不足。                  

                  

  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 方法的结果。              

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

             

 

     

   下表根据结果类型说明了各个方法类型。用户应将Call<type>Method 中的 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  Call<type>Method (JNIEnv*env,jclass classzz , jfieldID fieldID);           

       

   它们与于实例方法的唯一区别在于第二个参数jclass classzz代表的是类引用,而不是类实例。

     

  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

七、注册本地方法                  

                

  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”;失败时返回负数。                  

 

 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

    其实,JNI方面的书籍还是比较少的,建议大家看看《JNI编程指南》,算的上个入门书籍吧,指望你能耐心点看。

常用JNI函数 最常用的JNI一些接口函数 立即下载

相关推荐

从零开始:在Windows WSL中搭建Openfoam7+blastfoam2.0.0开发环境(避坑大全)

本文详细指导在Windows WSL中搭建OpenFOAM 7与BlastFOAM 2.0.0开发环境,重点解析了安装过程中的常见“坑点”,如编译模式不匹配导致的符号错误,并提供了从系统准备、软件部署到环境验证的完整解决方案,帮助开发者高效构建CFD与爆炸模拟开发平台。

stem5的博客 527

Android JNI精细化讲解,让你彻底了解JNI(中)

Android开发中,随着对移动程序的安全性、性能等方面的重视,JNI技术也越发重要。如今,多数企业在招聘中、高级程序员时,基本上都要求熟悉JNI开发,所以,掌握JNI技术,也是我们迈进心仪企业的必备条件。本套课程共分为三部分,当前为第二部分,主要包括内容:1、JNI函数解析2、JNI类型解析3、JNI描述符(签名)解析4、JNI静态注册与动态注册原理解析5、JNI调用流程原理解析适合人群:1、有一定Android基础,零JNI基础的学员;2、接触过JNI,但却不甚了解的学员;3、使用过JNI,希望解其原理的学员;

Temporal Anti-Aliasing(时域抗锯齿TAA)

首先说一下走样:一般分为时域走样(如旋转车轮)和空域走样(锯齿),但在 TAA 技术是采用时域相关叠加混合技术来解决空域走样的问题。 简单看一下空域抗锯齿 (Spatial Anti-Aliasing, SAA)相关技术,最普及的莫过于 MSAA,被各大渲染引擎采用,但是 MSAA 并不适用于延迟渲染 (Deferred Rendering),随之出现了很多基于形态学的后处理抗锯齿技术,如 MLAA,FXAA,SMAA 等(具体看参见图形_反走样技术总结相关介绍),虽然他们表现良好且支持延迟渲染,但是都会面

qq_35312463的博客 1万+

JNI笔记 : 数据类型、JNI函数与签名

1 JNI技术简单介绍首先应该介绍什么是JNI,JNI是Java Native Interface的缩写,中文翻译Java本地接口, 也有译为Java本地调用。JNI是Java语言中的一门强大的技术,由于Android上层采用Java语言实现,所以也可以在Android中使用这门技术。 JNI技术主要是完成Java代码与native代码进行交互,简单说就是用Java代码调用native语言编

pecuyu 1万+

【Linux】U盘配置Ubuntu系统 ——(Win10+Ubuntu20.04)双系统安装教程

Ubuntu系统安装

WS_Change的博客 4331

HDMI2.1 FRL流控 概览

HDMI 2.1 FRL的流控本质是。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2083

1 Studying《jni spec》

本文详细介绍了Java Native Interface (JNI)的核心概念与常用接口,涵盖JNI编程的四大类函数:虚拟机调用接口、JavaVM接口、本地库定义函数和JNIEnv接口。重点解析了JNI中的字符串操作、数组处理、异常管理、引用类型(局部/全局/弱全局引用)、对象操作、字段与方法访问等关键功能,并提供了丰富的代码示例。文章还总结了JNI编程中的常见陷阱与最佳实践,包括ID缓存、内存泄漏防范、线程安全等问题,最后系统梳理了JNI数据类型和函数分类,为开发者提供了全面的JNI技术参考指南。

u012906122的专栏 2911

NS-3 和Aqua-sim-ng 学习笔记(一)

因为要搞水下网络,OMNET++不太合适,就转Aqua-sim。这是基于NS-2上的模型,NS-2需要额外学一门tcl脚本语言。 正好查到它的一个升级版Aqua-sim-NG,在github上,https://github.com/rmartin5/aqua-sim-ng是基于NS-3的,只需要基本的C++,不用学tcl语言。美滋滋。 装好ubuntu之后,安装NS-3和Aqu...

diboshang8820的博客 2191

JNI 实战全面解析

项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究。 JNI是什么? JNI(Java Native Interface)意为JAVA本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。 NDK是什么? Android NDK(Native Development Kit )是一套工具集合,允许你用像C/C++语言那样实现应用程序的一部分。 为什么要用NDK? 1、安全性,java是半解释型语言,很容易被反汇编后拿到源代码文件

banketree 10万+

Qt绘图库对决:QWT与QCustomPlot的实战选型指南

本文为Qt开发者提供了QWT与QCustomPlot两大绘图库的实战选型指南。文章从功能特性、性能资源、开发效率三大维度进行深度对比,并结合工业监控、科学计算、嵌入式设备等典型场景,给出了清晰的决策清单。对于需要专业科学图表(如极坐标、等高线图)的场景推荐QWT;对于追求高性能、实时性、快速开发及嵌入式部署的通用图表需求,QCustomPlot是更优选择。

alpha的博客 241

NeRF必读:Mip-NeRF总结与公式推导

由于远景近景的分辨率不同,导致经典NeRF对于多尺度场景的表达存在明显瑕疵:NeRF对于近景的重建比较模糊而对于远景的重建出现锯齿。简单粗暴的策略是supersampling,但是费时费力。相较于NeRF使用的位置编码(PE)方式,Mip-NeRF提出了积分位置编码的方式(IPE).这种编码方式可以多尺度地描述空间中的信息分布,make sense.

i_head_no_back的博客 6079

JNI学习积累之一 ---- 常用函数大全

本文原创,转载请注明出处:http://blog.youkuaiyun.com/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代...

g84ch的专栏 299

AIGC游戏开发:如何评估生成内容的玩家满意度?

如何量化评估生成内容对玩家体验的影响?本文聚焦AIGC生成的游戏内容(包括但不限于剧情、关卡、NPC对话、道具),系统探讨玩家满意度的评估方法论,覆盖主观与客观评估、静态与动态内容、短期与长期体验等场景。核心概念:定义AIGC与玩家满意度的关联维度;评估方法:主观(问卷/访谈)与客观(行为/生理数据)评估的技术细节;数学模型:构建多指标融合的评估模型;实战案例:以AIGC生成关卡为例,演示从数据采集到模型落地的全流程;工具资源:推荐数据采集、分析与建模的工具链;

AI天才研究院 1224

JNI学习积累之一 常用函数大全(转)

转自:https://blog.youkuaiyun.com/qinjuning/article/details/7595104最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 。心里想着该写点什么了?可是水平不够,再加上包括很多真正实现地方--中间层,基本上没看。于是乎,也就不...

u010832572的专栏 271

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【转】JNI学习积累之一 ---- 常用函数大全

原文网址:http://blog.youkuaiyun.com/qinjuning/article/details/7595104  本文原创,转载请注明出处:http://blog.youkuaiyun.com/qinjuning          最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式    还是贼看贼看代码, 同时利用烧机的便利,加Log观...

weixin_34306676的博客 82

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JNI中常用函数

字符串(JNI) 从java程序中传过去的String对象在本地方法中对应的是jstring类型,jstring类型和c中的char不同,所以如果你直接当做char使用的话,就会出错。因此在使用之前需要将jstring转换成为c/c++中的char*,这里使用JNIEnv的方法转换. 下面是访问String的一些方法: GetStringUTFChars将jstring转换成为UTF-8格式的ch...

qq_34108752的博客 273

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android JNI常用API函数介绍

(1)JNIEnv 结构体相关函数(2)JavaVM 结构体相关函数(3)jclass 相关函数(4)jobject 相关函数(5)字段相关函数(6)数组相关函数(7)字符串函数其实主要的JNI API 函数就上面这些相关的内容;大部分会用,那么JNI 的API 就没啥难度了。其他的API函数可以看jni.h文件,但是这个文件是没有注释的,根据字面意义理解就差不多了。除了JNIEnv和JavaVM使用的获取使用比较少,其他API使用的还是比较多的;

wenzhi的博客 2112

Android JNI文件操作常用函数

在Android开发中,对于JNI读写文件也是常用的功能,jni操作常用函数讲解就来简单分析方便更快了解jni读写文件功能。

安卓兼职framework和app工程师的博客 2139

JNI原理及常用方法概述

JNIEnv概念 :JNIEnv是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境。通过JNIEnv可以调用到一系列JNI系统函数。JNIEnv线程相关性:每个线程中都有一个 JNIEnv 指针。JNIEnv只在其所在线程有效, 它不能在线程之间进行传递。注意:在C++创建的子线程中获取JNIEnv,要通过调用JavaVM的AttachCurrentThread函数获得。

Easyhood的博客 3327

Jni函数调用

Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good) 19 Chap6: JNI传递返回值... 26 15.2.2.3 传递字符串... 28 15.2.2.4 传递整型数组... 29 15.

kangyaping的专栏 2万+

jni常用函数注释

记录下jni常用函数api 一、对照表 Java类型    本地类型         描述 boolean    jboolean       C/C++8位整型 byte       jbyte          C/C++带符号的8位整型 char       jchar          C/C++无符号的16位整型 short      jshort         C

qq_27688259的博客 702

JNI常用函数大全

要素:1、 该函数大全是基于C语言方式的,对于C++方式可以直接转换 ,例如,对于生成一个jstring类型的方法转换分别如下: C编程环境中使用方法为:(*env)->NewStringUTF(env , "123") ; C++编程环境中(例如,VC下)则是: env->NewString...

sunweiliang的博客 850

JNI 常用函数大全

最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式    还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 。心里想着该写点什么了?可是水平不够,再加上    包括很多真正实现地方--中间层,基本上没看。于是乎,也就不好卖弄了。         花了几天时间研究了下JNI,基本上知道如何使

转角万里路的专栏 814

JNI常用函数

JNI常用函数请参见 http://blog.youkuaiyun.com/qinjuning/article/details/7595104

Main_Stage的专栏 1144

04-JNI函数

本章是 JNI 函数的参考章节。它提供了所有 JNI 函数的完整列表。它还介绍了 JNI 函数表的具体布局。注意:使用 "必须 "一词来描述对 JNI 程序员的限制。例如,当你看到某个 JNI 函数必须接收一个非 NULL 对象时,你就有责任确保 NULL 不会传递给该 JNI 函数。因此,JNI 实现无需在该 JNI 函数中执行 NULL 指针检查。在明确不允许的情况下传递 NULL 可能会导致意外异常或致命崩溃。定义为既可返回 NULL 又可在出错时抛出异常的函数,

优快云爱好者的独到见解 1309
上一篇: JNI 数据类型转换(转)
下一篇: apk升级Sqlite数据库的升级及之前数据的保留
Li Chuan
博客等级 码龄14年 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值