首页 > 代码库 > 基于Android2.3.5系统:JNI与HAL实例解析[二]

基于Android2.3.5系统:JNI与HAL实例解析[二]

***************************************************************************************************************************
作者:EasyWave                                                                                                           时间:2015.01.27
类别:Android系统-基于Android2.3.5系统:JNI与HAL实例解析[二]                    声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:Android系统下JNI简介
        Android系统下的JNI的全称是:Java Native Interface (JNI),JNI标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。

二:Android系统下JNI本地接口函数集

        JNIEnv自变量是类型为JNIEnv的一个特殊JNI数据结构的指针,JNI数据结构的一个元素是指向由JVM生成的一个数组的指针;该数组的每个元素都是指向一个JNI函数的指针,可从固有方法的内容发出对JNI函数的调用。利用JNIEnv自变量,程序员可访问一系列函数。这些函数可划分为下述类别:

  • 获取版本信息
  • 进行类和对象操作
  • 控制对Java对象的全局和局部引用
  • 访问实例字段和静态字段
  • 调用实例方法和静态方法
  • 执行字串和数组操作
  • 产生和控制Java异常

       比如:在C/C++本地代码中访问Java的String对象,在Java中,使用的字符串String对象是Unicode码,即每个字符不论是中文还是英文或是符号,一个字符总是占用两个字节。在C/C++本地代码中创建Java的String对象,Java通过JNI接口可以将Java的字符串转换到C/C++中的宽字符串(wchar_t *),或是传回一个UTF-8的字符串(char *)到C/C++。反过来,C/C++可以通过一个宽字符串,或是一个UTF-8编码的字符串来创建一个Java端的String对象。

      2.1):字符串操作          

            jstringNewString(JNIEnv *env, const jchar *unicodeChars, jsize len); 
            利用 Unicode 字符数组构造新的 java.lang.String 对象。 
            参数: 
            env:JNI 接口指针。 
            unicodeChars:指向Unicode字符串的指针。 
            len:Unicode字符串的长度。
            返回值:Java 字符串对象。如果无法构造该字符串,则为 NULL。 
            抛出: OutOfMemoryError:如果系统内存不足。
   
            jsizeGetStringLength(JNIEnv *env, jstring string); 
            返回 Java 字符串的长度(Unicode 字符数)。 
            参数: 
            env:JNI 接口指针。 
            string: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。 

 
            voidReleaseStringChars(JNIEnv *env, jstring string,  const jchar *chars); 
            通知虚拟机平台相关代码无需再访问 chars。参数 chars 是一个指针,可通过 GetStringChars() 从 string 获得。与GetStringChars配对使用的。 
            参数: 
            env:JNI 接口指针。 
            string:Java 字符串对象。 
            chars:指向 Unicode 字符串的指针。 


             jstringNewStringUTF(JNIEnv *env, const char *bytes); 
            利用 UTF-8 字符数组构造新 java.lang.String 对象。 
            参数: 
            env:JNI 接口指针。如果无法构造该字符串,则为 NULL。 bytes:指向 UTF-8 字符串的指针。 
            返回值:Java 字符串对象。如果无法构造该字符串,则为 NULL。 
            抛出:OutOfMemoryError:如果系统内存不足。 
  
            jsizeGetStringUTFLength(JNIEnv *env, jstring string); 
            以字节为单位返回字符串的 UTF-8 长度。 
            参数: 
            env:JNI 接口指针。 
            string:Java 字符串对象。 
            返回值:返回字符串的 UTF-8 长度。 
  
            const tchar*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() 从 string 获得。 
            参数: 
            env:JNI 接口指针。 
            string:Java 字符串对象。
            utf:指向 UTF-8 字符串的指针。

          2.2):数组操作

          fsizeGetArrayLength(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:初始值。 
          返回值:Java 数组对象。如果无法构造数组,则为 NULL。 
          抛出:OutOfMemoryError:如果系统内存不足。 
  
          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 例程  

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

技术分享

            参数:  

            env:JNI 接口指针。

            length:数组长度。 

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

   三:Android系统下JNI本地接口函数集总结

          还有很多的函数,博文就不列出来了,这里是我学习过程中的一些小总结!

基于Android2.3.5系统:JNI与HAL实例解析[二]